Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 在SQL中给定多个约束的情况下,如何找到具有相同值的连续行数?_Sql Server_Sql Server 2012_Sequence_Partitioning_Ranking - Fatal编程技术网

Sql server 在SQL中给定多个约束的情况下,如何找到具有相同值的连续行数?

Sql server 在SQL中给定多个约束的情况下,如何找到具有相同值的连续行数?,sql-server,sql-server-2012,sequence,partitioning,ranking,Sql Server,Sql Server 2012,Sequence,Partitioning,Ranking,我正在使用SQL Server 2012,我的数据如下所示: ActivityID ActivityCode Name_of_User ActivityCode_PrevActivity isLastActivityByUserSame 1020 B1 ABE A2 0 1021 A2 BOB A1

我正在使用SQL Server 2012,我的数据如下所示:

ActivityID  ActivityCode    Name_of_User    ActivityCode_PrevActivity   isLastActivityByUserSame
1020        B1              ABE             A2                           0
1021        A2              BOB             A1                           0
1022        A2              BOB             A2                           1
1023        B1              ABE             B1                           1
1024        B1              ABE             B1                           1
1025        B2              ABE             B1                           0
1026        B2              CARL            A3                           0
1027        A1              CARL            B2                           0
1028        B8              BOB             A2                           0
1029        A1              CARL            A1                           1
1030        B2              ABE             B2                           1
1031        B4              ABE             B2                           0
1032        B8              BOB             B8                           1
1033        A3              BOB             B8                           0
1034        B4              CARL            A1                           0
正如对字段所代表内容的简要概述:

  • 活动ID:表的主键
  • 活动代码:用户的活动类型
  • 用户的名称:用户的名称
  • ActivityCode\u PrevActivity:用户上次活动的活动代码
  • isLastActivityByUserSame:二进制值,用于指示用户的最后一个活动代码是否与当前活动代码相同
除此之外,还有一些其他专栏可能对手头的任务没有帮助

我想按用户的名称生成一个连续行数的运行计数,每行的值相同。为了让您了解这将是什么样子,下面是预期结果(请注意新的连续活动计数列):

我试着使用类似于:

Select *, 
DENSE_RANK() OVER (PARTITION BY Name_of_User ORDER BY ActivityID) as ConsecReports
FROM ActivityTable
但是,我一点运气都没有

计算此类列的最佳方法是什么


提前谢谢

我想我找到了一个好办法。我首先为它们出现的序列创建ID,然后计算连续的正“isLastActivityByUserSame”的数量

以下是解决方案:

SELECT at.*,
   (CASE WHEN at.isLastActivityByUserSame != 0
         THEN SUM(CASE WHEN at.isLastActivityByUserSame != 0 THEN at.isLastActivityByUserSame END) OVER (PARTITION BY Name_of_User, LastSequenceID ORDER BY ActivityID)
    ELSE 0 END) AS ConsecActivityCount
FROM (select at.*,
         SUM(CASE WHEN isLastActivityByUserSame != 0 THEN 0 ELSE 1 END) OVER (ORDER BY ActivityID) AS LastSequenceID
  FROM ActivityTable at
 ) at ORDER BY Name_of_User, ActivityID;

使用下面的查询。它会起作用的

SELECT  *
        ,ROW_NUMBER()OVER(PARTITION BY Name_of_User, ActivityCode ORDER BY ActivityID)-1 AS ConsecActivityCount 
FROM    ActivityTable

a是的,此查询按用户名称和活动代码将数据拆分。但是,保持连续计数并在每次在isLastActivityByUserSame字段中找到“0”时将计数重置为“0”效果不佳。正如您的屏幕截图所示,它似乎在这种有限的情况下起作用,但在对更大的样本进行手动计数后,这是远远不够的
SELECT  *
        ,ROW_NUMBER()OVER(PARTITION BY Name_of_User, ActivityCode ORDER BY ActivityID)-1 AS ConsecActivityCount 
FROM    ActivityTable