sql-server - 计算列中值的非连续出现次数
问题描述
我有下表:
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'
计算值的每次出现,而不是仅计算非连续值。
我该如何解决这个问题?
解决方案
首先,我在表中添加了一个标识列,它将创建一个行号。然后我创建了第二个表并 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
推荐阅读
- http - curl 能够从 https 获取;但是从 golang 的 http.get() 中,相同的 https URL 不起作用
- php - 如何使用(Axios、php 和 vue.js)在编辑表单中填充当前数据
- php - Facebook\WebDriver\Exception\ElementNotVisibleException:元素不可交互
- java - 如何通过@ControllerAdvice 中的@ResponseStatus 捕获异常
- android - RecyclerView - 如何将数据发送到 MainActivity
- blueprism - 如何从 Blueprism 中的多层集合中引用字段?
- api - 如果已经在 nginx 中配置了 https,我是否需要在我的应用程序中配置 https
- python - 使用机器学习根据之前的 6 个数字系列(训练数据)预测接下来的 6 个数字系列
- ios - 选择时更改 imageView 的 tintColor 不起作用
- asp.net-core - 如何从 Asp.net Core 中的查询字符串验证 Azure AD B2C 令牌?