【发布时间】:2019-10-29 15:14:04
【问题描述】:
给定下表“订单”:
+--------------------------+
| id|order|country|cstm_id |
+--------------------------+
| 1 |O-1 |DE |1 |
| 4 |O-2 |AT |2 |
| 5 |O-3 |DE |2 |
| 6 |O-5 |AT |2 |
| 8 |O-6 |DE |3 |
| 10|O-10 |DE |3 |
| 11|O-11 |AT |3 |
| 12|O-123|DE |1 |
+--------------------------+
id 列和 order 列都缺少值。
我成功地使用此代码查找 id 中的缺失值:
select start, stop from (
select m.id + 1 as start,
(select min(id) - 1 from orders as x where x.id > m.id) as stop
from orders as m
left outer join orders as r on m.id = r.id - 1
where r.id is null
) as x
where stop is not null;
想要的结果:
+------------+
| start|stop |
+------------+
| 2 |3 |
| 7 |7 |
| 9 |9 |
+------------+
但是,我在如何对 order 列执行相同操作时遇到了障碍,因为序列是非数字的。
【问题讨论】:
-
您当前的查询可以使用窗口函数重写以提高效率。
标签: sql postgresql gaps-and-islands