这有可能做到吗?

sql
sql-server
omega
omega
发布于 2022-04-14
2 个回答
Tim Biegeleisen
Tim Biegeleisen
发布于 2022-04-14
已采纳
0 人赞同

我们可以在这里使用 LEAD LAG

WITH cte AS (
    SELECT id, LAG(id) OVER (ORDER BY id) lag_id, LEAD(id) OVER (ORDER BY id) lead_id
    FROM yourTable
SELECT id
FROM cte
WHERE lag_id <> id - 1 OR lead_id <> id + 1
ORDER BY id;
如果数字不是从表中排序的,这还能工作吗?我看到你已经有一个 order by id 。这是否能处理好排序问题,还是我需要确保先进行排序?
@omega 你的表格中的数值没有实际的 "顺序"。 你似乎想让这个逻辑适用于升序排列的数字系列。 我的答案中 LEAD LAG 中的 ORDER BY 子句就是这样假设的。
D-Shih
D-Shih
发布于 2022-04-14
0 人赞同

你可以尝试使用 LEAD LAG 窗口函数,计算哪些行是连续的1。

SELECT Val
FROM (
 SELECT *,
       LEAD(Val) OVER(ORDER BY Val) - Val gap1,