查询中是否可以有多个 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
错误消息(至少在版本 23.x 中)实际上是:
ERROR 10752: User defined distinct aggregate cannot be used in query with other distinct aggregates
。
这是一个选择列表中的两个
DISTINCT
表达式导致了问题,在这里:您只能在同一查询中按一组分组列进行分组 - 并且每个 DISTINCT 表达式都会转换为自己的一组分组列。
所以 - 分而治之:
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 |