sql - 将历史表转换为使用范围日期(从和到日期)而不是快照日期

标签 sql postgresql amazon-redshift

我希望这在一个简单的 SQL 选择语句中完成,没有任何该环境独有的函数(派生查询、公用表表达式、临时表 INSERT、UPDATE 语句都可以)。检查帖子末尾的标签以了解原因。

如果有任何问题,请引用我。我在 stackoverflow 中找不到与我一样清楚的标题。

用例示例 原表:history_table_snapshot

Value|Date
50   |01
50   |02
24   |03
50   |04

转换表:history_table_range

Value|DateStart|DateEnd
50   |01       |03
24   |03       |04
50   |04       |infinity

此外,使此查询处理其他复杂/大规模用例(即历史表中的 50 列,除主键外的某些列可能为空)

最佳答案

滞后 window function应该做的伎俩:

CREATE TABLE history_table_range
(Value, DateStart, DateEnd)
AS 
SELECT Value, Date, LAG (DATE) OVER (ORDER BY date DESC)

编辑:
正如 Gordon Linoff 在评论中指出的那样,仅使用 lead 会更简洁:

CREATE TABLE history_table_range
(Value, DateStart, DateEnd)
AS 
SELECT Value, Date, LEAD (DATE) OVER (ORDER BY date)

关于sql - 将历史表转换为使用范围日期(从和到日期)而不是快照日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27982539/

相关文章:

temp-tables - 如何在 redshift 中创建和调用临时表

amazon-web-services - 将数据从 Amazon Aurora 同步到 Redshift

sql - 如何在oracle中创建表作为选择(CTAS)?

asp.net - SQL MAX() 函数很慢,有没有更好的方法?

postgresql - SET SESSION AUTHORIZATION 多用户 mod-perl2 连接缓存的安全设计

json - 直接从 JSON 对象更新 Postgresql 表

mysql - SQL - 在这种情况下可以避免游标吗?

sql - 在单个结果行中连接选定的值,可以完成(不分组)吗?

Postgresql Centos 问题

apache-spark - Amazon s3a 使用 Spark-redshift 库返回 400 错误请求