我需要计算连续值的序列号。这听起来像是一份工作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
我希望该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*
当 SQL 到达第 6 行时,它继续对子集“A”进行编号,而我将其视为恰好也被命名为“A”的新子集的第一行。
有没有办法ROW_NUMBER()
严格地进行分区,而不是默认行为?
这里和其他地方有很多关于用 SQL 计算连续值的问题。但是,我还没有看到解决PARTITION BY
字段中重复值的问题。大多数只处理增加的值,通常是日期。
我能够使用以下方法解决这个问题
LAG()
:这将为记录 #1、#4 和 #6 返回“新子集”。显然
LAG()
分区与ROW_NUMBER()
.显然,这不提供行号,但它帮助我达到了识别连续数字序列的目标,当子集标识符可以重复时。
我们在这里所做的是,
rst
代码中的列)sum()
获取组(grp
代码中的列)row_number()
从分组中获取。代码,
您可以在此处查看带有结果的 DBFiddle
我使用了这篇文章中的答案并针对您的问题对其进行了修改。