Sql 如何使用listag和Regexp\u replace获取不同的值
以下是我的疑问:Sql 如何使用listag和Regexp\u replace获取不同的值,sql,oracle,plsql,Sql,Oracle,Plsql,以下是我的疑问: 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\u 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\u replace进行此操作?任何其他功能/想法
提前感谢。无需使用
REGEXP\u REPLACE
即可实现,例如使用DISTINCT
:
SELECT LISTAGG(product_name, chr(10)) WITHIN GROUP (ORDER BY product_name)
"Product_Listing"
FROM (SELECT DISTINCT product_name FROM products) s;
无需使用
REGEXP\u REPLACE
即可实现,例如使用DISTINCT
:
SELECT LISTAGG(product_name, chr(10)) WITHIN GROUP (ORDER BY product_name)
"Product_Listing"
FROM (SELECT DISTINCT product_name FROM products) s;
若您只寻找具有不同产品的一行,那个么卢卡斯的方法可以很好地工作 如果您确实需要任何其他摘要列,那么它可能不会满足您的需要。您可以改为使用此选项:
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;
我不建议删除listag()
之后的重复项,如果只是因为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;
这将删除相邻的重复项。由于按排序,重复项是相邻的。所以,它应该是有效的。若您只寻找具有不同产品的一行,那个么卢卡斯的方法很有效 如果您确实需要任何其他摘要列,那么它可能不会满足您的需要。您可以改为使用此选项:
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;
我不建议删除listag()
之后的重复项,如果只是因为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;
这将删除相邻的重复项。由于按排序,重复项是相邻的。因此,它应该可以工作。我还有其他列,我正在使用LISTAGG。这就是为什么我想在LISTAGG之后选择不同的值。我如何才能做到这一点?@user10273980一个不准确的问题将产生一个不准确的答案。。问题中没有任何内容表明使用多个列。。阅读“帮助他人重现问题”或“这就是为什么我想在LISTAGG之后选择不同的值。我如何才能做到这一点?”这不是很简单,那么你需要动态地将LISTAGG字符串转换回你不想这样做的记录。我还有其他列,我正在使用LISTAGG。这就是为什么我想在LISTAGG之后选择不同的值。我如何才能做到这一点?@user10273980一个不准确的问题将产生一个不准确的答案。。问题中没有任何内容表明使用多个列。。阅读“帮助他人重现问题”或“这就是为什么我想在LISTAGG之后选择不同的值。我如何才能做到这一点?”这不是很简单,那么您需要动态地将LISTAGG字符串转换回您不想这样做的记录。谢谢。我想在LISTAGG之后使用regexp\u replace实现这一点。这可能吗?@user10273980。为什么?这是一个非常简单的解决方案,我有以下几种情况:选择组(按名称排序)中的ID、CL_T、PG、listag(名称、chr(10))作为名称,组(按职务排序)中的listag(职务、chr(10))作为职务,组(按薪金排序)中的listag(薪金、chr(10))作为EMP集团按ID、CL_T、PG发放的工资,CL_T=按ID排列的“COMMT”顺序;我希望名称列具有不同的值,工作和薪水列具有Listag输出。谢谢。我想在LISTAGG之后使用regexp\u replace实现这一点。这可能吗?@user10273980。为什么?这是一个非常简单的解决方案,我有以下几种情况:选择组(按名称排序)中的ID、CL_T、PG、listag(名称、chr(10))作为名称,组(按职务排序)中的listag(职务、chr(10))作为职务,组(按薪金排序)中的listag(薪金、chr(10))作为EMP集团按ID、CL_T、PG发放的工资,CL_T=按ID排列的“COMMT”顺序;我需要具有不同值的名称列,以及具有LISTAGG输出的职务和薪资列。请发布输入数据。如果没有它,你很难给出你想要的答案。请发布输入数据。没有它,你很难给出你想要的答案。