Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TSQL计数连续记录_Sql Server_Tsql_Grouping_Partition - Fatal编程技术网

Sql server TSQL计数连续记录

Sql server TSQL计数连续记录,sql-server,tsql,grouping,partition,Sql Server,Tsql,Grouping,Partition,假设我有以下记录: KeyCol ColA ColB ------------------------ 1 1 A 2 2 B 3 2 B 4 2 C 5 2 B 6 1 A 7 2 B 8 2 B 我想用这个结果计算ColA

假设我有以下记录:

KeyCol     ColA     ColB
------------------------
1          1        A
2          2        B
3          2        B
4          2        C
5          2        B
6          1        A
7          2        B
8          2        B
我想用这个结果计算ColA和ColB中具有相同值的连续记录

Col A      ColB     Start   Count
---------------------------------
1          A        1       1
2          B        2       2
2          C        4       1
2          B        5       1
1          A        6       1
2          B        7       2
关于分组和计数有很多类似的问题,但我不知道如何将其转化为这个问题。尤其是许多其他示例没有明确的键列

我尝试使用配分函数计算连续记录的数量,并从中得出:

SELECT KeyCol, ColA, ColB
      ,ROW_NUMBER() OVER 
            (   PARTITION
                BY ColA, ColB
                ORDER BY KeyCol
            ) as RowNo
FROM MyTable
但是,这会产生以下结果:

KeyCol    Col A      ColB     RowNo
---------------------------------
1         1          A        1
2         2          B        1
3         2          B        2
4         2          C        1
5         2          B        3   (Needs to be 1)
6         1          A        2   (Needs to be 1)
7         2          B        4   (Needs to be 1)
8         2          B        5   (Needs to be 2)
如您所见,对于所有相同的ColA、ColB,即使记录不是连续的,行号也会增加

多谢各位

这是一个问题。您需要使用排名函数来标识ColB的相同值的组(岛)。以下查询:

SELECT  KeyCol,
        ColA,
        ColB,
        GroupBy = ROW_NUMBER() OVER(ORDER BY KeyCol) - 
                    ROW_NUMBER() OVER(PARTITION BY ColA, ColB ORDER BY KeyCol)
FROM    dbo.T
ORDER BY KeyCol;
您将获得以下输出:

KeyCol     ColA     ColB    GroupBy
-----------------------------------------
1          1        A           0
2          2        B           1
3          2        B           1
4          2        C           3
5          2        B           2
6          1        A           4
7          2        B           3
8          2        B           3   
如您所见,这标识了您的孤岛,其中两个(或更多)连续行具有相同的ColA和ColB值,您将在列
GroupBy
中获得相同的值

一旦你有了它,这是一个简单的分组的情况下,它得到你所需的输出。给出以下内容的最终查询(带有样本数据):


你试过什么吗?如果有,请将查询编辑到您的问题中。您好,谢谢您的评论。我刚刚添加了一个我尝试过的问题。嗨,加雷斯,回答得很好,谢谢!我只有一个问题:你能让它在KeyCol自身存在漏洞的情况下工作吗。假设第三条记录以KeyCol=4开始。这就是我面临的情况。好奇的是,我仍然可以通过中间步骤使用您的答案,在中间步骤中创建一个表,其中包含连续的KeyCol值。@Roeland抱歉,我一直都犯这个错误。。。。我已经编辑了答案,所以现在它不再使用
KeyCol-ROW_NUMBER()…
来生成标识符,而是使用一个进一步的排序函数来生成一个没有空格的序列来替换KeyCol。现在它看起来很简单,有了答案:)非常感谢Gareth,我做梦也想不到这么快的解决方案!!
DECLARE @T TABLE (KeyCol INT, ColA INT, ColB CHAR(1));
INSERT @T (KeyCol, ColA, ColB)
VALUES
    (1, 1, 'A'), (2, 2, 'B'), (3, 2, 'B'), (4, 2, 'C'),
    (5, 2, 'B'), (6, 1, 'A'), (7, 2, 'B'), (8, 2, 'B');

WITH RankedData AS
(   SELECT  KeyCol,
            ColA,
            ColB,
            GroupBy = ROW_NUMBER() OVER(ORDER BY KeyCol) - 
                        ROW_NUMBER() OVER(PARTITION BY ColA, ColB ORDER BY KeyCol)
    FROM    @T
)
SELECT  ColA, 
        ColB,
        Start = MIN(KeyCol),
        [Count] = COUNT(*)
FROM    RankedData
GROUP BY ColA, ColB, GroupBy
ORDER BY Start;