String Oracle LISTAGG()用于多个属性?
我想知道是否有更好的(即更快的执行)解决方案来解决下面描述的问题 步骤1) 步骤2) 我想返回以下数据集String Oracle LISTAGG()用于多个属性?,string,oracle,aggregate-functions,string-concatenation,listagg,String,Oracle,Aggregate Functions,String Concatenation,Listagg,我想知道是否有更好的(即更快的执行)解决方案来解决下面描述的问题 步骤1) 步骤2) 我想返回以下数据集 (k, v1_list, v2_list) 1, (1,2,3,4), (1,2,3) 2, (7), (8,9) 步骤3) 我可以通过运行listag()的多重组合来解决这个问题,我想知道是否可以用另一种方式实现它。 在本例中,我处理了两个属性,但实际上我必须对数百个列表运行类似的语句。如下所示的查询可能会变得复杂。我想知道它是否可以在一个查询中完成,可能需要多次使用listag() w
(k, v1_list, v2_list)
1, (1,2,3,4), (1,2,3)
2, (7), (8,9)
步骤3)
我可以通过运行listag()的多重组合来解决这个问题,我想知道是否可以用另一种方式实现它。
在本例中,我处理了两个属性,但实际上我必须对数百个列表运行类似的语句。如下所示的查询可能会变得复杂。我想知道它是否可以在一个查询中完成,可能需要多次使用listag()
with q1 as (
select distinct k, listagg (v1, ', ') within group (order by k) over (partition by k) v1_list
from t
group by k, v1),
q2 as (
select distinct k, listagg (v2, ', ') within group (order by k) over (partition by k) v2_list
from t
group by k, v2)
--
select distinct t.k, v1_list, v2_list from t
--
join q1 on q1.k = t.k
join q2 on q2.k = t.k
谢谢你的建议
--Lukas您可以尝试使用未记录的函数
wm\u concat
select k, wm_concat(distinct(v1)), wm_concat(distinct(v2))
from t
group by k
或使用listagg
select k, listagg(v1, ', ') within group (order by k), listagg(v2, ', ') within group (order by k)
from (
select distinct k, v1, null v2 from t
union all
select distinct k, null v1, v2 from t
)
group by k
还有另一种方式:
select t.k
,(select listagg(column_value,', ') within group (order by column_value)
from table(v1)) v1
,(select listagg(column_value,', ') within group (order by column_value)
from table(v2)) v2
from (select k
,cast(collect (distinct v1) as sys.odcinumberlist) v1
,cast(collect (distinct v2) as sys.odcinumberlist) v2
from T t
group by k) t
或不强制转换到odcinumberlist:
select t.k
,(select listagg(column_value,', ') within group (order by column_value)
from table(v1)) v1
,(select listagg(column_value,', ') within group (order by column_value)
from table(v2)) v2
from (select k
,collect (distinct v1) v1
,collect (distinct v2) v2
from T t
group by k) t
它会在逗号后留下一个空格吗?但您还需要一个子查询来对其排序,请参阅。对于机修工来说,这看起来并不简单,因为你们的反应很快。我试图检查Dmitry针对我必须处理的大量数据提出的第二个解决方案,看看我是否在性能上达到差异。如果我有任何结果,我会在这里发布,这是我的朋友提供的另一个解决方案。火葬场去费利克斯,干杯,伙计!请提供:)
select t.k
,(select listagg(column_value,', ') within group (order by column_value)
from table(v1)) v1
,(select listagg(column_value,', ') within group (order by column_value)
from table(v2)) v2
from (select k
,cast(collect (distinct v1) as sys.odcinumberlist) v1
,cast(collect (distinct v2) as sys.odcinumberlist) v2
from T t
group by k) t
select t.k
,(select listagg(column_value,', ') within group (order by column_value)
from table(v1)) v1
,(select listagg(column_value,', ') within group (order by column_value)
from table(v2)) v2
from (select k
,collect (distinct v1) v1
,collect (distinct v2) v2
from T t
group by k) t