Sql server 在SQL中给定多个约束的情况下,如何找到具有相同值的连续行数?
我正在使用SQL Server 2012,我的数据如下所示: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
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