我有一张像
这样的表格ID name Start_no End_no
1 a 2 123
2 b 3 65
3 c 191 199
4 d 201 225
5 e 220 223
6 f 221 224
我试过了:
SELECT *
FROM IV_STOCK_DETAILS a
where a.STOCK_START_NO in ( select b.stock_end_no
from IV_STOCK_DETAILS B
where b.stock_start_no between a.stock_start_no
AND A.STOCK_END_NO
AND B.STOCK_END_NO BETWEEN a.stock_start_no
AND A.STOCK_END_NO
AND (a.stock_start_no - A.STOCK_END_NO) !=0
)
ORDER BY cod_stock_branch, stock_start_no;
所以我需要逐行检查所有行及其之前的行,如果其start_no
和end_no
位于前一个打印行的start_no
和end_no
之内。在这种情况下,答案将是第2,5,6行......我只需要查询。
答案 0 :(得分:3)
以下是使用LAG
函数或Oracle的解决方案,可让您访问上一行。
而且,根据您的要求,您应该只从表中获得第2行和第5行,因为第6行的end_no
为224,这不小于第5行的end_no
223
SELECT id, name, start_no, end_no
FROM (
SELECT id, name, start_no, end_no,
lag(start_no, 1, 0) over (order by id) prev_start_no ,
lag(end_no, 1, 0) over (order by id) prev_end_no
FROM test
)
WHERE start_no BETWEEN prev_start_no AND prev_end_no
AND end_no BETWEEN prev_start_no AND prev_end_no;
答案 1 :(得分:2)
加入救援!将表连接到先前的ID上,并在连接中包含范围测试。
SELECT iv.*
FROM IV_STOCK_DETAILS AS iv
JOIN IV_STOCK_DETAILS AS ivprev ON iv.id=ivprev.id+1
AND ivprev.Start_no <= iv.Start_no
AND iv.End_no <= ivprev.End_no