SQL-通过条件分组行,直到发现异常为止
我正试图根据一些条件向数据集中添加一个组列。举个简单的例子:SQL-通过条件分组行,直到发现异常为止,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正试图根据一些条件向数据集中添加一个组列。举个简单的例子: ╔════╦══════╗ ║ ID ║ DATA ║ ╠════╬══════╣ ║ 1 ║ 12 ║ ║ 2 ║ 20 ║ ║ 3 ║ 3 ║ ║ 4 ║ 55 ║ ║ 5 ║ 11 ║ ╚════╩══════╝ 假设我们的标准是数据应该大于10。那么结果应该类似于: ╔════╦══════╦═══════╗ ║ ID ║ DATA ║ GROUP ║ ╠════╬══════╬═══════
╔════╦══════╗
║ ID ║ DATA ║
╠════╬══════╣
║ 1 ║ 12 ║
║ 2 ║ 20 ║
║ 3 ║ 3 ║
║ 4 ║ 55 ║
║ 5 ║ 11 ║
╚════╩══════╝
假设我们的标准是数据应该大于10。那么结果应该类似于:
╔════╦══════╦═══════╗
║ ID ║ DATA ║ GROUP ║
╠════╬══════╬═══════╣
║ 1 ║ 12 ║ 1 ║
║ 2 ║ 20 ║ 1 ║
║ 3 ║ 3 ║ 2 ║
║ 4 ║ 55 ║ 3 ║
║ 5 ║ 11 ║ 3 ║
╚════╩══════╩═══════╝
因此,在发生条件异常之前满足条件的所有行都成为组的一部分。组的编号不一定需要遵循此模式,我只是觉得这是一个逻辑/简单的编号,可以解释我正在寻找的解决方案。您可以通过查找数据所在的每一行来计算组标识符这可以通过递归查询轻松完成:
;WITH CTE
AS (SELECT *,
1 AS [GROUP]
FROM TABLEB
WHERE ID = 1
UNION ALL
SELECT T1.ID,
T1.DATA,
CASE
WHEN T1.DATA < 10 THEN T2.[GROUP] + 1
ELSE T2.[GROUP]
END [GROUP]
FROM TABLEB T1
INNER JOIN CTE T2
ON T1.ID = T2.ID + 1)
SELECT *
FROM CTE
可以在上找到一个工作示例
祝你好运 你们能解释一下你们是如何得到条件数据大于10的组的吗?我将得到1、2、3、3、4作为组ID。第一行满足条件,第二行也满足条件,但第三行不满足条件……因此,在发生异常之前满足条件的每一行都将被分组。抱歉,如果原始帖子不清晰,为什么将值为3的行放入自己的组中?@GordonLinoff根据此分组,我希望能够统计组中的项目。如果说第2组中有3个项目是不正确的,因为实际上只有2个项目符合标准。2*计数*是否必要?
select t.*,
sum(case when t2.data <= 10) over (order by id) as groupId
from t;
select t.*,
((select 2*count(*)
from t t2
where t2.id < t.id and
t2.data <= 10
) + (case when t.id <= 10 then 1 else 0 end)
) as groupId
from t;
;WITH CTE
AS (SELECT *,
1 AS [GROUP]
FROM TABLEB
WHERE ID = 1
UNION ALL
SELECT T1.ID,
T1.DATA,
CASE
WHEN T1.DATA < 10 THEN T2.[GROUP] + 1
ELSE T2.[GROUP]
END [GROUP]
FROM TABLEB T1
INNER JOIN CTE T2
ON T1.ID = T2.ID + 1)
SELECT *
FROM CTE