Eu preciso calcular números de sequência para valores consecutivos. Isso soa como um trabalho para 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
Eu esperava que a PARTITION
cláusula redefinisse a contagem a cada alteração em Subset
, mas, em vez disso, o SQL Server coleta todos os valores para um determinado Subset
valor e os numera. Aqui está o que eu esperava e o que recebi:
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*
Quando o SQL atinge a linha 6, ele retoma a numeração do subconjunto "A", enquanto eu o vejo como a primeira linha de um novo subconjunto que também é chamado de "A".
Existe uma maneira de fazer a ROW_NUMBER()
partição estritamente, em vez do comportamento padrão?
Há várias perguntas aqui e em outros lugares sobre a contagem de valores consecutivos com SQL. No entanto, ainda não vi um que aborda valores repetidos no PARTITION BY
(s) campo(s). A maioria lida apenas com valores crescentes, geralmente datas.
Consegui resolver isso usando
LAG()
:Isso retorna "Novo subconjunto" para os registros #1, #4 e #6. Aparentemente
LAG()
particiona um pouco diferente doROW_NUMBER()
.Obviamente, isso não fornece números de linha, mas me ajudou a atingir o objetivo de identificar sequências consecutivas de números, quando o identificador do subconjunto pode se repetir.
O que fazemos aqui é,
rst
no código)sum()
para obter grupos (colunagrp
no código)row_number()
do agrupamento.Código,
Você pode ver o DBFiddle com resultados aqui
Eu usei minha resposta deste post e modifiquei para o seu problema.