Can I calculate ROW_NUMBER() for only consecutive records?
I was able to address this using 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
This returns "New subset" for records #1, #4, and #6. Apparently LAG()
partitions slightly differently from ROW_NUMBER()
.
Obviously this doesn't provide row numbers, but it helped me reach the goal of identifying consecutive sequences of numbers, when the subset identifier can repeat.
What we do here is,
- Calculate resets (column
rst
in code) sum()
to get groups (columngrp
in code)- Get the
row_number()
from the grouping.
Code,
SELECT row_number() OVER (PARTITION BY grp ORDER BY sequence) AS number,
sequence,
subset
FROM (
SELECT count(rst) OVER (ORDER BY sequence) AS grp, *
FROM (
SELECT CASE WHEN subset != lag(subset) OVER (ORDER BY sequence) THEN 1 END AS rst, *
FROM foo
) AS t1
) AS t2;
You can see the DBFiddle with results here
- https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=13de970857770ce27462565b4063e1d0