如何在SQL中查找组内序列中的缺失值?
我有一个 ID 和位置表
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
我想要找到的是按 ID 排列的位置序列中是否有任何中断,在本例中是 44,1 和 44,3 之间的中断,
我已经设法一起解析:
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
但是它如果有多个 ID 值,则不起作用。 如果只有一个 ID 44 存在,它就可以工作。
想法、评论、建议?
谢谢!
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!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
左自连接是一个很好的本能,但我不认为聚合会削减它,并且当然您需要在自连接中包含匹配 ID 子句。
这是一个使用 null-left-join 思想的(符合 ANSI 的)版本,选择顶行和底行并检查它们之间没有任何内容:
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:
本次查询发现单据,希望有用; 如果您使用的是 SQL 2005,则可以使用 CTE
This query spots the slips, hope to be useful; if you are in SQL 2005, you can use a CTE