- 此问题已在此处有答案**:
LISTAGG in Oracle to return distinct values(24回答)
8天前关闭
我有一个查询,其结果是:* (编辑:13.06.2023 12:30)*
|ID|USER_NAME |
|--|--------------------|
|1 |A1,A1,A1,B12,B12,C32|
|2 |A1 |
|3 |B12,C32 |
- 查询以上结果:**
SELECT
ID,
LISTAGG (user_name, ',') WITHIN GROUP (ORDER BY user_name )
From my_table
GROUP BY ID;
- 我尝试用','替换'|'并删除重复项并修剪最后一个分隔符为:**
SELECT
ID,
RTRIM(REGEXP_REPLACE(LISTAGG (user_name, ',') WITHIN GROUP (ORDER BY user_name ), '([^,]+)(,|\1)+', '\1|'),'|')
From my_table
GROUP BY ID;
- 输出为:**
|ID|USER_NAME |
|--|------------|
|1 |A1|2|B12|C32|
|2 |A1 |
|3 |B12|C32 |
- 编辑:**LISTAGG和REGEXP应该是一个长查询的一部分,而不是一个独立的SELECT(LISTAGG的输出应该是一个长查询的一列)。这个例子应该只显示我最终想要的输出。
user_name和ID % 1的第二个值不正确。
如何获得正确的值?查询中有什么错误?
谢谢你。
2条答案
按热度按时间c9qzyr3d1#
首先选择不同的值,然后将
listagg
应用于已经不同的数据集:9vw9lbht2#
您可以使用
collect
聚合来获取不同的值,然后在集合上使用listagg
。| ID|用户名|
| - -----|- -----|
| 1| A1| B12| C32|
| 2| A1|
| 3| B12| C32|
fiddle