这与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 |
答案 0 :(得分:1)
这可以通过结合使用Redshift的LISTAGG
函数和SPLIT_PART
函数来实现。
LISTAGG
concatenates all values in a group into a single string,可以选择让您订购污染对象并提供定界符。SPLIT_PART
splits a string by a delimiter and returns the chosen 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;