sql - 根据从下一行开始的当前值对行进行分组
问题描述
我需要用 . 为所有下一行增加组号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
开始递增,但我需要为下一行开始递增。
预期输出:
解决方案
一种解决方案是每次找到 a 时增加 1 z
,然后在最后将结果滞后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 - 如果选择的类别级别低于配置的级别,则显示最低级别
- python - 为什么我会收到 AmbiguousForeignKeysError?
- java - 在java中创建一个shell控制台(类似于windows中的cmd,unix中的bash等)
- java - 您可以在不导入或使用任何 Java 标准库包或组件的情况下读取 .txt 文件吗?
- c - 将输出重定向回C中的终端
- wordpress - Headless Wordpress,有没有办法将 wp_options 表中的数据作为 REST 端点访问?
- javascript - 如何处理 TypeError:无法读取 javascript 中未定义的属性“复数”
- kubernetes - Azure kubernetes - Istio 证书安装?
- android - 在 Flutter 应用中使用单独的 FlutterFragmentActivity
- database - 我们可以使用 DynaTrace 来监控数据库表的列值吗?