甲骨文设置:
CREATE TABLE articles (id, category, value, dt) AS
SELECT 1, 1, 1, DATE '2017-01-01' FROM DUAL UNION ALL
SELECT 2, 1, 2, DATE '2017-01-02' FROM DUAL UNION ALL -- Previous row
SELECT 3, 1, NULL, DATE '2017-01-03' FROM DUAL UNION ALL -- Ignored as value is null
SELECT 4, 1, 1, DATE '2017-01-04' FROM DUAL UNION ALL -- Chosen id
SELECT 5, 2, 3, DATE '2017-01-05' FROM DUAL UNION ALL -- Ignored as different category
SELECT 6, 1, 5, DATE '2017-01-06' FROM DUAL; -- Next row
查询:(:your_id
下面设置为4中的示例输出)
SELECT *
FROM (
SELECT a.*,
LAG(CASE WHEN value IS NOT NULL THEN id END) IGNORE NULLS OVER (PARTITION BY category ORDER BY dt) AS prv,
LEAD(CASE WHEN value IS NOT NULL THEN id END) IGNORE NULLS OVER (PARTITION BY category ORDER BY dt) AS nxt
FROM articles a
)
WHERE :your_id IN (id, nxt, prv)
AND (id = :your_id OR value IS NOT NULL)
ORDER BY dt;
输出:
ID CATEGORY VALUE DT PRV NXT
---------- ---------- ---------- ------------------- ---------- ----------
2 1 2 2017-01-02 00:00:00 1 4
4 1 1 2017-01-04 00:00:00 2 6
6 1 5 2017-01-06 00:00:00 4
来源
2017-06-02 01:23:45
MT0