Jon*_*des 7 sql-server window-functions gaps-and-islands sql-server-2017
我需要计算连续值的序列号。这听起来像是一份工作ROW_NUMBER()!
DECLARE @Data TABLE
(
Sequence TINYINT NOT NULL PRIMARY KEY,
Subset CHAR(1) NOT NULL
)
INSERT INTO @Data (Sequence, Subset) VALUES
(1, 'A'),
(2, 'A'),
(3, 'A'),
(4, 'B'), -- New subset
(5, 'B'),
(6, 'A') -- New subset
SELECT
Sequence, Subset,
ROW_NUMBER() OVER (PARTITION BY Subset ORDER BY Sequence) AS SeqWithinGroup
FROM
@Data
Run Code Online (Sandbox Code Playgroud)
我希望该PARTITION子句在 中的每次更改时重置计数Subset,但 SQL Server 会收集给定Subset值的所有值并对它们进行编号。这是我所期望的,以及我得到的:
Sequence Subset Expected Actual
-------- ------ -------- -----
1 A 1 1
2 A 2 2
3 A 3 3
4 B 1 1
5 B 2 2
6 A *1* *4*
Run Code Online (Sandbox Code Playgroud)
当 SQL 到达第 6 行时,它恢复对子集“A”进行编号,而我将其视为刚好也被命名为“A”的新子集的第一行。
有没有办法ROW_NUMBER()严格分区,而不是默认行为?
这里和其他地方有很多关于使用 SQL 计算连续值的问题。但是,我还没有看到解决PARTITION BY字段中重复值的问题。大多数只处理递增的值,通常是日期。
我能够使用以下方法解决这个问题LAG():
SELECT
Sequence, Subset,
CASE WHEN Sequence = 1 OR Subset <> LAG(Subset, 1) OVER (ORDER BY Sequence)
THEN 'New subset'
ELSE 'Continuation'
END
FROM
@Data
Run Code Online (Sandbox Code Playgroud)
这将返回记录 #1、#4 和 #6 的“新子集”。显然LAG()分区与ROW_NUMBER().
显然,这不提供行号,但它帮助我实现了当子集标识符可以重复时识别连续数字序列的目标。
| 归档时间: |
|
| 查看次数: |
5379 次 |
| 最近记录: |