通过匹配两列并返回数组来获取最早的日期

时间:2019-04-24 12:35:59

标签: amazon-redshift

我有一个要编写的查询,但是语法不正确。在下表中,我设置了一个带有id的日期,并且如果id没有parent_id,并且如果parent_id对于{ {1}}是id

我正在尝试获取与父代具有相同日期的父代所有子代的输出。如下面的预期输出所示,NULL将被分配给[D#P, Z#Z],因为它们具有相同的A并且它们的dateparent_id,但是{{1 }}不会分配给A,因为它的日期不是Q#L。没有为A1/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

1 个答案:

答案 0 :(得分:2)

我不知道为什么在使用LISTAGG aggregate function时会出错,因此我决定将SELECT DISTINCTLISTAGG 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 BYLISTAGG 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等;