sql - 从下一行开始根据当前值对行进行分组

标签 sql sql-server

我需要使用 value <> z 增加所有下一行的组号。 z意味着接下来的所有行都根据b将具有相同的组号。

CREATE TABLE #tmp
(
    a CHAR(1)
  , b INT
);

INSERT INTO #tmp (a
                , b)
VALUES ('a', 1)
     , ('b', 2)
     , ('z', 3)
     , ('c', 4)
     , ('z', 5)
     , ('z', 6)
     , ('d', 7);

SELECT       t.a
           , t.b
           , SUM(v.is_z) OVER (ORDER BY t.b ROWS UNBOUNDED PRECEDING) - ROW_NUMBER() OVER (ORDER BY t.b) group_nbr
  FROM       #tmp                                                 AS t
 CROSS APPLY (SELECT CASE WHEN a = 'z' THEN 2 ELSE 1 END AS is_z) AS v
 ORDER BY 2;

DROP TABLE #tmp;

在我的查询中,该组从值为 z 的行开始递增。 ,但我需要开始为下一行增加它。

预期输出:

enter image description here

最佳答案

解决方案是每次找到 z 时加 1,然后 LAG结果最后增加 1 行。

;WITH CumulativeZ AS
(
    SELECT
        T.*,
        CumulativeZ = SUM(CASE WHEN T.a = 'z' THEN 1 ELSE 0 END) OVER(ORDER BY T.b ASC)
    FROM
        #tmp AS T
)
SELECT
    C.a,
    C.b,
    C.CumulativeZ,
    [Group] = LAG(C.CumulativeZ, 1, 0) OVER (ORDER BY C.b ASC)
FROM
    CumulativeZ AS C

结果:

a   b   CumulativeZ Group
a   1   0           0
b   2   0           0
z   3   1           0
c   4   1           1
z   5   2           1
z   6   3           2
d   7   3           3

请注意,LAG 函数适用于 SQL Server 2012+。您可以在 2008+ 版本上使用 ROW_NUMBER 来模仿它的功能。

关于sql - 从下一行开始根据当前值对行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54362520/

相关文章:

java - 添加子表计数以使用 hibernate criteria API 从父表中选择

c# - 锁定表sql server

python - 将 timedelta 对象转换为时间对象

sql-server - 打开从 sql server 下载的 Office 文件时出错

SQL Server 报告 'Invalid column name' ,但该列存在并且查询通过 Management Studio 进行

sql - TSQL - 计算多语句表 UDF 中的特定值并将它们传递给附加列

SQL Server Merge,如何按日期范围(年)对目标进行子集化

java - 从 ResultSet 获取 boolean 值

sql - 我将如何构建用于接收销售订单的数据库?

json - 如何从存储在表中的嵌套 JSON 对象返回多行