【发布时间】:2019-12-05 07:18:45
【问题描述】:
【问题讨论】:
-
should be列中的26值的来源是什么? -
你的预期输出是什么?
标签: sql oracle window-functions
【问题讨论】:
should be 列中的26 值的来源是什么?
标签: sql oracle window-functions
假设should be列中26值的来源是BC003,则可以使用Lead,如下所示:
With tab (BC003) as( Select 1 from dual
UNION ALL
Select 18 from dual
UNION ALL
Select 26 from dual)
Select BC003, NVL(Lead(BC003) over (Order by 1),BC003) "Shoud be"
from tab;
输出:
SQL> /
BC003 Shoud be
---------- ----------
1 18
18 26
26 26
【讨论】:
Oracle 设置:
CREATE TABLE test_data( id, object, bc003, track_change ) AS
SELECT 121, 12, 1, 15 FROM DUAL UNION ALL
SELECT 121, 13, 1, NULL FROM DUAL UNION ALL
SELECT 121, 14, 1, NULL FROM DUAL UNION ALL
SELECT 121, 15, 1, NULL FROM DUAL UNION ALL
SELECT 121, 16, 1, NULL FROM DUAL UNION ALL
SELECT 121, 12, 18, 22 FROM DUAL UNION ALL
SELECT 121, 13, 18, NULL FROM DUAL UNION ALL
SELECT 121, 14, 18, NULL FROM DUAL UNION ALL
SELECT 121, 15, 18, NULL FROM DUAL UNION ALL
SELECT 121, 16, 18, NULL FROM DUAL
查询 1:
您可以使用解析函数:
SELECT t.*,
MIN( track_change ) OVER ( PARTITION BY id, bc003 ) AS track_change_new
FROM test_data t
查询 2:
您可以将LAG 与IGNORE NULLS 子句一起使用:
SELECT t.*,
COALESCE(
track_change,
LAG( track_change ) IGNORE NULLS OVER (
PARTITION BY id, bc003
ORDER BY object
)
) AS track_change_new
FROM test_data t
输出:
两者输出相同:
身份证 |对象 | BC003 |跟踪更改 | TRACK_CHANGE_NEW --: | -----: | ----: | ------------: | ---------------: 121 | 12 | 1 | 15 | 15 121 | 13 | 1 | 空 | 15 121 | 14 | 1 | 空 | 15 121 | 15 | 1 | 空 | 15 121 | 16 | 1 | 空 | 15 121 | 12 | 18 | 22 | 22 121 | 13 | 18 | 空 | 22 121 | 14 | 18 | 空 | 22 121 | 15 | 18 | 空 | 22 121 | 16 | 18 | 空 | 22
db小提琴here
【讨论】: