Получить родительские значения для конкретного условия - Oracle SQL - PullRequest
0 голосов
/ 03 мая 2019

У меня есть таблица:

table1

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, например 'HI%' для КАЖДОГО id, line_num, мне нужно получить первые значения '-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?

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Если вы просто хотите выбрать родительские значения, вот один из способов:

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.

1 голос
/ 03 мая 2019

При самостоятельном присоединении на необходимых условиях:

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...