Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Oracle LISTAGG()用于多个属性?_String_Oracle_Aggregate Functions_String Concatenation_Listagg - Fatal编程技术网

String Oracle LISTAGG()用于多个属性?

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

我想知道是否有更好的(即更快的执行)解决方案来解决下面描述的问题

步骤1)

步骤2)

我想返回以下数据集

(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