首页 > 解决方案 > 计算列中值的非连续出现次数

问题描述

我有下表:

ID   Value
1     X
1     Y
1     X
1     X
1     X
1     Y
1     X
2     X
2     Y
2     X
2     Z
2     Y
2     X

我需要计算每个 ID 出现 X 的非连续次数。所以我的输出应该是:

ID    COUNT
1      3
2      3     

使用Select Count(*), ID From my_table where value = 'X'计算值的每次出现,而不是仅计算非连续值。

我该如何解决这个问题?

标签: sql-server

解决方案


首先,我在表中添加了一个标识列,它将创建一个行号。然后我创建了第二个表并 Make RN - 1 以获取下一行并进行连接。最后,我为 Count 值添加了条件。

DECLARE @tbl TABLE
(
    RN int IDENTITY(1,1),
    Id int,
    Value varchar(10)
)

INSERT INTO @tbl
Values (1,'X'),(1,'Y'),(1,'X'),(1,'X'),(1,'X'),(1,'Y'),(1,'X'),(2,'X'),(2,'Y'),(2,'X'),(2,'Z'),(2,'Y'),(2,'X')

SELECT A.Id1, SUM(A.XCount) AS Count
From(
SELECT RN1 =  t.RN, Id1 = t.Id, Value1 = t.Value, RN2 = t2.RN, Id2 = t2.Id, Value2 = t2.[Value], 
XCount = CASE WHEN t.[Value] = 'X' AND (t.[Value] != t2.[Value] OR t.[Id] != t2.[Id] OR t2.[Value] IS NULL)  THEN 1 ELSE 0 END 
    FROM @tbl t
    Left JOIN (SELECT RN = RN - 1 , Id, Value FROM @tbl ) as t2 ON t.RN = t2.RN
) A
GROUP BY A.Id1

推荐阅读