![](/img/trans.png)
[英]Need help in using LISTAGG or REGEXP_REPLACE with DISTINCT function
[英]How to get distinct values using LISTAGG and Regexp_replace
以下是我的查询:
SELECT LISTAGG(product_name, chr(10)) WITHIN GROUP (ORDER BY product_name) "Product_Listing"
FROM products;
查询的输出是:
apple
orange
apple
mango
orange
banana
banana
apple
所需的输出是:
apple
orange
mango
banana
如何为此使用regexp_replace? 任何其他功能/想法。
提前致谢。
不用REGEXP_REPLACE
就可以实现,例如使用DISTINCT
:
SELECT LISTAGG(product_name, chr(10)) WITHIN GROUP (ORDER BY product_name)
"Product_Listing"
FROM (SELECT DISTINCT product_name FROM products) s;
如果您只想寻找与众不同的产品,那么Lukasz的方法很好用。
如果您实际上还需要其他任何摘要列,那么它可能不会满足您的要求。 您可以改用以下方法:
SELECT LISTAGG(CASE WHEN seqnum = 1 THEN product_name END, chr(10))
WITHIN GROUP (ORDER BY product_name) as Product_Listing
FROM (SELECT p.*,
ROW_NUMBER() OVER (PARTITION BY product_name ORDER BY product_name) as seqnum
FROM products p
) p;
我不建议在LISTAGG()
之后删除重复项,仅因为Oracle对结果强加了很短的限制。 但是您可以按照以下方式进行操作:
SELECT REGEXP_REPLACE(LISTAGG(product_name END, chr(10)) WITHIN GROUP (ORDER BY product_name),
'([^\x10]+)(\x10\1)+',
'\1'
) as Product_Listing
FROM products p;
这将删除相邻的重复项。 由于ORDER BY
,重复项是相邻的。 因此,它应该工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.