簡體   English   中英

獲取特定條件的父值-Oracle SQL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM