[英]Get parent values for specific condition - Oracle SQL
我有一張桌子:
表格1
id e_id e_value line_num
64 HI02-01 ABF 32
64 HI02-02 E039 32
64 HI03-01 XYZ 32
64 HI03-02 E039 32
64 AI05-01 XYZ 32
64 AI05-02 E039 32
67 HI02-01 ABC 28
67 HI02-02 R590 28
67 HI03-01 WQE 28
僅對於e_id,例如每個ID(line_num)為“ HI%”,我需要作為父母獲取第一個“ -01”值。
對於前。
HI02-01是HI02-02,HI02-03,HI02-04的父級
HI03-01是HI03-02,HI03-03,HI03-04的父級
輸出如下:
id e_id e_value line_num parent_e_id parent_e_value
64 HI02-01 ABF 32 HI02-01 ABF
64 HI02-02 E039 32 HI02-01 ABF
64 HI03-01 XYZ 32 HI03-01 XYZ
64 HI03-02 E039 32 HI03-01 XYZ
64 AI05-01 XYZ 32
64 AI05-02 E039 32
67 HI02-01 ABC 28 HI02-01 ABC
67 HI02-02 R590 28 HI02-01 ABC
67 HI03-01 WQE 28 HI03-01 WQE
如何在Oracle sql中完成此操作?
通過自動加入您需要的條件:
select t.*,
tt.e_id parent_e_id, tt.e_value parent_e_value
from tablename t left join tablename tt
on tt.id = t.id and tt.line_num = t.line_num
and t.e_id like 'HI%' and tt.e_id like 'HI%'
and (tt.e_id = coalesce((
select max(e_id) from tablename
where id = t.id and line_num = t.line_num and e_id < t.e_id
and substr(e_id, 1, 4) = substr(t.e_id, 1, 4)
), t.e_id)
)
參見演示 。
結果:
> ID | E_ID | E_VALUE | LINE_NUM | PARENT_E_ID | PARENT_E_VALUE
> -: | :------ | :------ | -------: | :---------- | :-------------
> 64 | HI02-01 | ABF | 32 | HI02-01 | ABF
> 64 | HI02-02 | E039 | 32 | HI02-01 | ABF
> 64 | HI03-01 | XYZ | 32 | HI03-01 | XYZ
> 64 | HI03-02 | E039 | 32 | HI03-01 | XYZ
> 64 | AI05-01 | XYZ | 32 | |
> 64 | AI05-02 | E039 | 32 | |
> 67 | HI02-01 | ABC | 28 | HI02-01 | ABC
> 67 | HI02-02 | R590 | 28 | HI02-01 | ABC
> 67 | HI03-01 | WQE | 28 | HI03-01 | WQE
假設您只想選擇父值,這是一種方法:
WITH table1 AS (SELECT 64 ID, 'HI02-01' e_id, 'ABF' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'HI02-02' e_id, 'E039' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'HI03-01' e_id, 'XYZ' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'HI03-02' e_id, 'E039' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'AI05-01' e_id, 'XYZ' e_value, 32 line_num FROM dual UNION ALL
SELECT 64 ID, 'AI05-02' e_id, 'E039' e_value, 32 line_num FROM dual UNION ALL
SELECT 67 ID, 'HI02-01' e_id, 'ABC' e_value, 28 line_num FROM dual UNION ALL
SELECT 67 ID, 'HI02-02' e_id, 'R590' e_value, 28 line_num FROM dual UNION ALL
SELECT 67 ID, 'HI03-01' e_id, 'WQE' e_value, 28 line_num FROM dual)
SELECT ID,
e_id,
e_value,
line_num,
CASE WHEN e_id LIKE 'HI%' THEN first_value(e_id) OVER (PARTITION BY ID, line_num, CASE WHEN e_id LIKE 'HI%' THEN SUBSTR(e_id, 1, 4) END ORDER BY e_id) END parent_e_id,
CASE WHEN e_id LIKE 'HI%' THEN first_value(e_value) OVER (PARTITION BY ID, line_num, CASE WHEN e_id LIKE 'HI%' THEN SUBSTR(e_id, 1, 4) END ORDER BY e_id) END parent_e_value
FROM table1;
ID E_ID E_VALUE LINE_NUM PARENT_E_ID PARENT_E_VALUE
---------- ------- ------- ---------- ----------- --------------
64 HI02-01 ABF 32 HI02-01 ABF
64 HI02-02 E039 32 HI02-01 ABF
64 HI03-01 XYZ 32 HI03-01 XYZ
64 HI03-02 E039 32 HI03-01 XYZ
64 AI05-01 XYZ 32
64 AI05-02 E039 32
67 HI02-01 ABC 28 HI02-01 ABC
67 HI02-02 R590 28 HI02-01 ABC
67 HI03-01 WQE 28 HI03-01 WQE
這使用first_value
分析函數輸出每個組中的第一個值,但僅當e_id以HI開頭時。 我假設所有HI%e_ids都具有相同的XXNN-NN格式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.