主要伎倆是創建 「人工」 標識使用它作爲錨在遞歸CTE:
DECLARE @T TABLE( ID INT, 拉特VARCHAR(100) , Datefield SMALLDATETIME);
INSERT INTO @T
VALUES (360123, 'Beginner', '1/22/2011'),
(360123, NULL, '2/22/2011'),
(360123, 'Beginner', '3/22/2011'),
(360123, 'Intermediate', '4/22/2011'),
(360123, 'Beginner', '12/22/2011'),
(360123, 'Beginner', '01/22/2012');
DECLARE @BeginTime AS DATETIME = '1/22/2011';
DECLARE @EndTime AS DATETIME = '6/22/2012';
WITH M
AS (SELECT DISTINCT Id,
MONTH(datefield) AS Mth,
YEAR(datefield) AS Yr,
ROW_NUMBER() OVER (PARTITION BY Id ORDER BY YEAR(datefield), MONTH(datefield)) AS RN
FROM @T AS T
WHERE Lvl = 'Beginner'
AND T.Datefield >= @BeginTime
AND T.Datefield <= @EndTime),
C (Id, RN, MonthsInARow, Mth, Yr)
AS (SELECT M.Id,
RN,
CAST (1 AS INT),
Mth,
Yr
FROM M
WHERE RN = 1
UNION ALL
SELECT M.Id,
M.RN,
CASE
WHEN M.Mth = C.Mth + 1
OR (M.Mth = 1
AND C.Mth = 12
AND M.Yr = C.yr + 1) THEN C.MonthsInARow + 1 ELSE 1
END,
M.Mth,
M.Yr
FROM M
INNER JOIN
C
ON M.Id = C.Id
AND M.RN = C.RN + 1)
SELECT [C].[Id],MAX([C].[MonthsInARow]) MAXMonth
FROM C
GROUP BY [Id]
在這種情況下,您正在尋找連續4個月,您的'WHERE'子句僅涵蓋4個月(3月,4月,5月,6月)。情況總是如此嗎? –