我有一个要编写的查询,但是语法不正确。在下表中,我设置了一个带有id
的日期,并且如果id
没有parent_id
,并且如果parent_id
对于{ {1}}是id
。
我正在尝试获取与父代具有相同日期的父代所有子代的输出。如下面的预期输出所示,NULL
将被分配给[D#P, Z#Z]
,因为它们具有相同的A
并且它们的date
是parent_id
,但是{{1 }}不会分配给A
,因为它的日期不是Q#L
。没有为A
或1/1/2019
分配任何东西,因为它们在创建日期上没有子代。
我在Postgres中找到了有关如何执行此操作的帖子,但是由于我使用Redshift,因此某些操作无效。
任何帮助将不胜感激。
B
预期输出:
D
当前工作:
|date |id |parent_id |
-------------------------
1/1/2019|A |NULL
1/1/2019|B |NULL
1/1/2019|C |NULL
1/1/2019|D#P |A
1/1/2019|Z#Z |A
1/1/2019|K#H |C
1/2/2019|Q#L |A
1/3/2019|D |NULL
1/4/2019|H#Q |C
答案 0 :(得分:2)
我不知道为什么在使用LISTAGG
aggregate function时会出错,因此我决定将SELECT DISTINCT
与LISTAGG
window function一起使用:
WITH input as (
SELECT '1/1/2019' as date, 'A' as id, NULL as parent_id UNION ALL
SELECT '1/1/2019', 'B', NULL UNION ALL
SELECT '1/1/2019', 'C', NULL UNION ALL
SELECT '1/1/2019', 'D#P', 'A' UNION ALL
SELECT '1/1/2019', 'Z#Z', 'A' UNION ALL
SELECT '1/1/2019', 'K#H', 'C' UNION ALL
SELECT '1/2/2019', 'Q#L', 'A' UNION ALL
SELECT '1/3/2019', 'D', NULL UNION ALL
SELECT '1/4/2019', 'H#Q', 'C'
), parents as (
SELECT *
FROM input
WHERE parent_id IS NULL
), children as (
SELECT *
FROM input
WHERE parent_id IS NOT NULL
)
SELECT DISTINCT
parents.date,
parents.id,
listagg(children.id, ',') WITHIN GROUP ( ORDER BY children.id )OVER (PARTITION BY parents.id, parents.date) as children
FROM parents JOIN children
ON parents.id = children.parent_id
AND parents.date = children.date
输出:
date id children
1/1/2019 A D#P,Z#Z
1/1/2019 C K#H
用GROUP BY
和LISTAGG
aggregate function解决方案,对我来说更自然地解决您的问题:
WITH input as (
[...]
SELECT
parents.date,
parents.id,
listagg(children.id, ',') WITHIN GROUP ( ORDER BY children.id )
FROM parents JOIN children
ON parents.id = children.parent_id
AND parents.date = children.date
group by parents.id, parents.date
可悲的是,它返回了一个我不太了解的错误:
[XX000] [500310] Amazon无效操作:必须在至少一个用户创建的表上应用一个或多个使用的函数。仅用户表功能的示例包括LISTAGG,MEDIAN,PERCENTILE_CONT等; java.lang.RuntimeException:com.amazon.support.exceptions.ErrorException:Amazon无效操作:必须在至少一个用户创建的表上应用一个或多个使用的函数。仅用户表功能的示例包括LISTAGG,MEDIAN,PERCENTILE_CONT等;