连续记录结果

问题描述:

我正在研究一个数据结构,其中包含每个人的正面或负面结果列表。连续记录结果

的样本数据(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

这看起来像经典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

使用案例和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