繁体   English   中英

如何过滤 DISTINCT 记录并使用 LISTAGG 函数对其进行排序

[英]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 排序的结果。

需要您对此的投入。

由于您不能将不同的列用于组内的distinctorder 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM