Vertica 多重 Listagg 语句

问题描述 投票:0回答:1

查询中是否可以有多个 listagg 语句。我知道在 oracle 中我可以有多个 listagg 列。尝试使用列构建单个表时出现错误。

WITHIN GROUP (ORDER BY ID)
在 Vertica 中也不起作用

    SELECT ID,
       LISTAGG(DISTINCT serv_yr) AS SRV_YR,
       LISTAGG(DISTINCT serv_yrmo) AS SRV_YRMO
    FROM table_x x 
    GROUP BY 1
SQL Error [5366] [0A000]: [Vertica][VJDBC](5366) 
ERROR: User defined aggregate cannot be used in query with other distinct aggregates
sql oracle vertica listagg
1个回答
0
投票

错误消息(至少在版本 23.x 中)实际上是:

ERROR 10752:  User defined distinct aggregate cannot be used in query with other distinct aggregates

这是一个选择列表中的两个

DISTINCT
表达式导致了问题,在这里:您只能在同一查询中按一组分组列进行分组 - 并且每个 DISTINCT 表达式都会转换为自己的一组分组列。

所以 - 分而治之:

  • 在一个子查询中获取第一个 LISTAGG()
  • 将该子查询的输出连接回基表,并再次分组,这次是通过子查询中获得的
    id
    和 LISTAGG() 输出:
WITH
-- some input ...
table_x(id,serv_yr,serv_yrmo) AS (
            SELECT  1, 2022, 202201
  UNION ALL SELECT  1, 2022, 202204
  UNION ALL SELECT  1, 2022, 202207
  UNION ALL SELECT  1, 2022, 202207
  UNION ALL SELECT  1, 2022, 202210
  UNION ALL SELECT  1, 2023, 202301
  UNION ALL SELECT  1, 2023, 202304
  UNION ALL SELECT  1, 2023, 202307
  UNION ALL SELECT  1, 2023, 202307
  UNION ALL SELECT  1, 2023, 202310
  UNION ALL SELECT  2, 2022, 202201
  UNION ALL SELECT  2, 2022, 202204
  UNION ALL SELECT  2, 2022, 202207
  UNION ALL SELECT  2, 2022, 202207
  UNION ALL SELECT  2, 2022, 202210
  UNION ALL SELECT  2, 2023, 202301
  UNION ALL SELECT  2, 2023, 202304
  UNION ALL SELECT  2, 2023, 202307
  UNION ALL SELECT  2, 2023, 202307
  UNION ALL SELECT  2, 2023, 202310
)
-- real query starts here, replace following comma with "WITH"
,
yr_agg(id,srv_yr) AS (
  SELECT                 
    id
  , LISTAGG(DISTINCT serv_yr)   AS srv_yr
  FROM table_x
  GROUP BY 1
)
SELECT
  table_x.id
, srv_yr
, LISTAGG(DISTINCT serv_yrmo) AS srv_yrmo
FROM table_x
JOIN yr_agg USING(id)
GROUP BY 1,2;
id srv_yr srv_yrmo
2 2022,2023 202310,202210,202207,202201,202204,202307,202301,202304
1 2022,2023 202204,202201,202210,202207,202301,202310,202307,202304
© www.soinside.com 2019 - 2024. All rights reserved.