Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-通过条件分组行,直到发现异常为止_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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