i have a table of IDs and positions
CREATE TABLE #MissingSequence (ID INT NOT NULL, Position INT NOT NULL) INSERT INTO #MissingSequence (ID,Position) SELECT 36,1 UNION ALL SELECT 36,2 UNION ALL SELECT 36,3 UNION ALL SELECT 36,4 UNION ALL SELECT 36,5 UNION ALL SELECT 36,6 UNION ALL SELECT 44,1 UNION ALL SELECT 44,3 UNION ALL SELECT 44,4 UNION ALL SELECT 44,5 UNION ALL SELECT 44,6
What I am trying to find is if there is any break in the sequence of Positions by ID in this case the break between 44,1 and 44,3
I’ve managed to parse together:
SELECT l.ID ,Start_Position = MIN(l.Position) + 1 ,Stop_Position = MIN(fr.Position) - 1 FROM #MissingSequence l LEFT JOIN #MissingSequence r ON l.Position = r.Position - 1 LEFT JOIN #MissingSequence fr ON l.Position < fr.Position WHERE r.Position IS NULL AND fr.Position IS NOT NULL GROUP BY l.ID
but it doesn’t work if there are multiple ID values. It does work if only a single ID, 44 exists.
thoughts, comments, suggestions?
thanks!
The left self-join was a good instinct, but I don’t think the aggregates are going to cut it, and certainly you’d need to include the matching-ID clause in your self-joins.
Here’s an (ANSI-compliant) version using the null-left-join idea, selecting a top row and a bottom row and checking there’s nothing between them: