Это также можно сделать с помощью фильтра QUALIFY , который позволяет выполнять фильтрацию после стадии выбора, а логарифм фильтра c не отображается в результатах.
with class as (
select * from values
(2, 'BETA'),
(6, 'OMEGA'),
(5, 'SIGMA'),
(1, 'ALPHA'),
(3, 'GAMMA'),
(4, 'DELTA')
v(id, name)
), t_data as (
select * from values
(1101111, 1404, 564, 1404, 'BETA'),
(1101111, 1404, 599, 1425, 'ALPHA'),
(1101111, 1404, 564, 1404, 'OMEGA'),
(1101111, 1404, 564, 1425, 'ALPHA'),
(1101111, 1404, 564, 1404, 'GAMMA'),
(1101111, 1404, 564, 1425, 'GAMMA'),
(1101111, 1404, 599, 1425, 'GAMMA'),
(1101111, 1404, 564, 1425, 'OMEGA')
v(C_ID, P_ID, D_ID, S_ID, CLASS)
)
select c_id, p_id, d_id, s_id, d.class
from t_data d
join class c on d.class = c.name
qualify row_number() over (partition by c_id, p_id, d_id, s_id order by c.id) = 1;
дает:
C_ID P_ID D_ID S_ID CLASS
1101111 1404 564 1404 BETA
1101111 1404 564 1425 ALPHA
1101111 1404 599 1425 ALPHA
, что совпадает с более явной / многословной формой:
select c_id, p_id, d_id, s_id, class from (
select c_id, p_id, d_id, s_id, d.class
,row_number() over (partition by c_id, p_id, d_id, s_id order by c.id) as rn
from t_data d
join class c on d.class = c.name
)
where rn = 1;
, которая на самом деле такая же механика, как у Стюарта DISTINCT
Если вы если вы действительно хотите сделать это через массив, вы можете упорядочить массив при построении с WITHIN GROUP (ORDER BY ..)
, а затем вы можете взять первый объект, но методы FIRST_VALUE или QUALIFY должны быть быстрее ... но если есть другие причины для сохранения массива, это может помочь
select C_ID, P_ID, D_ID, S_ID, class_array[0] ca from (
select C_ID, P_ID, D_ID, S_ID, arrayagg(class) within group (order by class.id) class_array
from t_data
join class on t_data.class = class.name
group by C_ID,P_ID,D_ID,S_ID
);