[英]How to filter DISTINCT records and ordering them using LISTAGG function
SELECT
s_id
,CASE WHEN LISTAGG(X.item_id, ',') WITHIN GROUP (ORDER BY TRY_TO_NUMBER(Z.item_pg_nbr))= '' THEN NULL
ELSE LISTAGG (X.item_id, ',') WITHIN GROUP (ORDER BY TRY_TO_NUMBER(Z.item_pg_nbr))
END AS item_id_txt
FROM table_1 X
JOIN table_2 Z
ON Z.cmn_id = X.cmn_id
WHERE s_id IN('38301','40228')
GROUP BY s_id;
当我运行上述查询时,我得到了 ITEM_ID_TXT 列重复的相同值。 我只想显示 DISTINCT 值。
S_ID ITEM_ID_TXT
38301 618444,618444,618444,618444,618444,618444,36184
40228 616162,616162,616162,616162,616162,616162,616162
我还希望按 item_pg_nbr 排序连接值
我可以在 LISTAGG 函数中使用 DISTINCT,但这不会给出 item_pg_nbr 排序的结果。
需要您对此的投入。
由于您不能将不同的列用于组内的distinct
和order by
,因此一种方法是:
1 在获取最小item_pg_nbr
时进行重复数据删除。
2 listagg
并按最低item_pg_nbr
。
create or replace table T1(S_ID int, ITEM_ID int, ITEM_PG_NBR int);
insert into T1 (S_ID, ITEM_ID, ITEM_PG_NBR) values
(1, 1, 3),
(1, 2, 9), -- Adding a non-distinct ITEM_ID within group
(1, 2, 2),
(1, 3, 1),
(2, 1, 1),
(2, 2, 2),
(2, 3, 3);
with X as
(
select S_ID, ITEM_ID, min(ITEM_PG_NBR) MIN_PG_NBR
from T1 group by S_ID, ITEM_ID
)
select S_ID, listagg(ITEM_ID, ',') within group (order by MIN_PG_NBR)
from X group by S_ID
;
我想问题就变成了当你在组中有重复时会发生什么? 最小item_pg_nbr
应该用于 order by 似乎是合乎逻辑的,但您也可以轻松地使用最大值或其他值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.