Redshift合并行并按时间戳解决冲突

时间:2019-05-06 19:08:42

标签: amazon-redshift

这与selecting row with latest timestamp question不同,并且特定于Redshift

我想允许用户在不同的时间点更新(登台)表行的部分,同时避免调用UPDATE语句。这是通过仅追加方法完成的,在该方法中,我们不断添加行,其中只有唯一ID和时间戳是必填项,而其他列可能有也可能没有提供值。

问题:

给定一个表,除了“主键”(未真正执行)和一个时间戳列之外,该表中的所有其他列都是可空的,我该如何合并所有具有相同主键的行如果存在一个这样的非空值,请为每个可空列选择最新的非空值,将其键入一行。

示例:

|id|timestamp|status|stringcol|numcol|
|1 |456      |begin |         |      |
|1 |460      |      |         |  2   |
|2 |523      |      |  foo    |      |
|1 |599      |mid   |  blah   |      |
|2 |624      |begin |         |      |
|1 |721      |done  |         |  60  |

应该产生

|id|timestamp|status|stringcol|numcol|
|2 |624      |begin |  foo    |      |
|1 |721      |done  |  blah   |  60  |

1 个答案:

答案 0 :(得分:1)

这可以通过结合使用Redshift的LISTAGG函数和SPLIT_PART函数来实现。

使用上面的示例5列表,您将需要以下内容:

SELECT id, 
       MAX(last_updated),
       SPLIT_PART(LISTAGG(status, ',') WITHIN GROUP(ORDER BY last_updated DESC), ',', 1),
       SPLIT_PART(LISTAGG(stringcol, ',') WITHIN GROUP(ORDER BY last_updated DESC), ',', 1),
       SPLIT_PART(LISTAGG(numcol, ',') WITHIN GROUP(ORDER BY last_updated DESC), ',', 1)
FROM table
GROUP BY 1;