如果在SQL中给出多个约束,如何找到具有相同值的连续行数?

时间:2016-10-08 23:38:54

标签: 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                           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

就像字段代表的简要概述一样:

  • ActivityID :表格的PK
  • ActivityCode :用户的活动类型
  • Name_of_User :用户名
  • ActivityCode_PrevActivity :用户上次活动的活动代码
  • isLastActivityByUserSame :指示用户的上一个活动代码是否与当前活动代码相同的二进制值

除此之外,还有一些其他专栏可能对手头的任务没有帮助。

我想通过Name_of_User生成每行具有相同值的连续行数的运行计数。为了让您了解它的外观,这是预期的结果(请注意新的 ConsecActivityCount 列):

ActivityID  ActivityCode    Name_of_User    ActivityCode_PrevActivity   isLastActivityByUserSame    ConsecActivityCount
1020        B1              ABE             A2                          0                           0
1023        B1              ABE             B1                          1                           1
1024        B1              ABE             B1                          1                           2
1025        B2              ABE             B1                          0                           0
1030        B2              ABE             B2                          1                           1
1031        B4              ABE             B2                          0                           0
1021        A2              BOB             A1                          0                           0
1022        A2              BOB             A2                          1                           1
1028        B8              BOB             A2                          0                           0
1032        B8              BOB             B8                          1                           1
1033        A3              BOB             B8                          0                           0
1026        B2              CARL            A3                          0                           0
1027        A1              CARL            B2                          0                           0
1029        A1              CARL            A1                          1                           1
1034        B4              CARL            A1                          0                           0

我尝试使用类似的东西:

Select *, 
DENSE_RANK() OVER (PARTITION BY Name_of_User ORDER BY ActivityID) as ConsecReports
FROM ActivityTable

但是,我没有运气。

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

提前致谢!

2 个答案:

答案 0 :(得分:0)

我想我找到了一个很好的解决方案。我首先为它们出现的序列创建了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;

答案 1 :(得分:0)

使用以下查询。它会起作用。

DataFrame.to_html()

enter image description here