2016-03-01 61 views
4

我正在研究一個數據結構,其中包含每個人的正面或負面結果列表。連續記錄結果

的樣本數據(ID是標識):

id  person result 
1  1  0 
2  1  1 
3  1  1 
4  2  1 
5  2  0 
6  1  1 
7  1  0 
8  2  0 
9  2  0 
10  2  0 

有了這個,我想算consecutiveresult = 1最大數量的每個人。此示例中的結果將是

person max_count 
1  3 
2  1 

我一直在使用ROW_NUMBER() OVER (PARTITION BY)這樣

SELECT person, 
ROW_NUMBER() OVER (PARTITION BY person, result ORDER BY id) AS max_count  
FROM TABLE 

嘗試,但它給了我一個accumulative計數,而不是consecutive之一。

我應該怎麼做連續計數?任何暗示將不勝感激。在此先感謝

+1

提示:'gap-and-islands'。什麼是SQL Server的版本?我想我可以寫最後的查詢,但有一點不清楚。爲什麼人'1'的'max_count'是'2'?根據你的樣品,它應該是'3',不是?行ID:'2,3,6'。行'4,5'是針對不同的人,我認爲他們應該被忽視,不是嗎?或者,您是否對嚴格的「連續」序列感興趣,其中ID **必須**在沒有任何間隙的序列中?如果您在示例中添加更多的行來解釋不同的變體,這將有助於理解您需要的內容。 –

+0

@VladimirBaranov你是對的。我在這個問題上犯了一個錯誤。現在將糾正。 – ydoow

回答

3

這看起來像經典gaps-and-islands問題。 在下面的查詢中檢查每個CTE的中間結果,以瞭解發生了什麼。

的樣本數據

我添加人員3有陽性結果的兩個序列,這樣我們就可以找到最長的序列。

DECLARE @T TABLE (id int, person int, result int); 
INSERT INTO @T (id, person, result) VALUES 
(1 , 1, 0), 
(2 , 1, 1), 
(3 , 1, 1), 
(4 , 2, 1), 
(5 , 2, 0), 
(6 , 1, 1), 
(7 , 1, 0), 
(8 , 2, 0), 
(9 , 2, 0), 
(10, 2, 0), 
(11, 3, 0), 
(12, 3, 1), 
(13, 3, 1), 
(14, 3, 1), 
(15, 3, 1), 
(16, 3, 0), 
(17, 3, 1), 
(18, 3, 1), 
(19, 3, 0), 
(20, 3, 0); 

查詢

WITH 
CTE_RowNumbers 
AS 
(
    SELECT 
     id, person, result 
     ,ROW_NUMBER() OVER (PARTITION BY person ORDER BY ID) AS rn1 
     ,ROW_NUMBER() OVER (PARTITION BY person, result ORDER BY ID) AS rn2 
    FROM @T 
) 
,CTE_Groups 
AS 
(
    SELECT 
     id, person, result 
     ,rn1-rn2 AS GroupNumber 
    FROM CTE_RowNumbers 
) 
,CTE_GroupSizes 
AS 
(
    SELECT 
     person 
     ,COUNT(*) AS GroupSize 
    FROM CTE_Groups 
    WHERE 
     result = 1 
    GROUP BY 
     person 
     ,GroupNumber 
) 
SELECT 
    person 
    ,MAX(GroupSize) AS max_count 
FROM CTE_GroupSizes 
GROUP BY person 
ORDER BY person; 

結果

+--------+-----------+ 
| person | max_count | 
+--------+-----------+ 
|  1 |   3 | 
|  2 |   1 | 
|  3 |   4 | 
+--------+-----------+ 
+0

在您的示例數據中,第1個人只有2個連續的積極結果,但在查詢結果中,它表示3? – Kim

+0

@Kim,查詢允許在確定序列時在ID中有空位。對於人員'1',ID爲「2,3,6」的行形成一系列具有'result = 1'的行。 –

+0

我看到......沒有注意到他在這個問題上所做的修改。我仍然看着P1 = 2的結果。 – Kim

0

使用案例和SUM就可以實現上述結果

DECLARE @T TABLE (id int, person int, result int); 
    INSERT INTO @T (id, person, result) VALUES 
    (1 , 1, 0), 
    (2 , 1, 1), 
    (3 , 1, 1), 
    (4 , 2, 1), 
    (5 , 2, 0), 
    (6 , 1, 1), 
    (7 , 1, 0), 
    (8 , 2, 0), 
    (9 , 2, 0), 
    (10, 2, 0) 
    select 
    person, 
    SUM(CASE WHEN RESULT = 1 then 1 else 0 END) 
    from @T 
    GROUP BY person 
+2

這不符合連續的要求。例如,對於人1,如果1之間有0。這將返回1的總和而不考慮零。 – ydoow