Amazon redshift 红移合并行并按时间戳解决冲突

Amazon redshift 红移合并行并按时间戳解决冲突,amazon-redshift,Amazon Redshift,这不同于,并且特定于红移 我希望允许用户在不同的时间点更新暂存表行的一部分,同时避免调用update语句。这是通过仅附加的方法完成的,在这种方法中,我们不断添加行,其中只有唯一id和时间戳是必需的,而其他列可能有也可能没有提供值 问题: 给定一个表,其中除了主键未真正强制和时间戳列之外,该表中的所有其他列都可以为null,如果存在一个这样的非null值,如何通过为每个可为null的列选择最新的非null值将具有相同主键的所有行合并到一行中 例如: |id|timestamp|status|str

这不同于,并且特定于红移

我希望允许用户在不同的时间点更新暂存表行的一部分,同时避免调用update语句。这是通过仅附加的方法完成的,在这种方法中,我们不断添加行,其中只有唯一id和时间戳是必需的,而其他列可能有也可能没有提供值

问题:

给定一个表,其中除了主键未真正强制和时间戳列之外,该表中的所有其他列都可以为null,如果存在一个这样的非null值,如何通过为每个可为null的列选择最新的非null值将具有相同主键的所有行合并到一行中

例如:

|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  |

这可以通过使用红移的listag函数和SPLIT_PART函数来实现

LISTAGG,可以选择允许您按顺序继续并提供分隔符。 分割部分 使用上面的示例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;

上面的查询需要由tooThanks@mdem7最后更新为group的一部分。这是一个输入错误,但实际上,在最后更新而不是group by时,PostgreSQL中有一个独特的on功能正是这样做的!但是,它在Amazon Redshift中不可用。以下是一些声称模仿这种行为的东西: