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

Sql 将历史表转换为使用范围日期(从和到日期)而不是快照日期,sql,postgresql,amazon-redshift,Sql,Postgresql,Amazon Redshift,我希望这可以在一个简单的SQL select语句中完成,而不需要该环境专用的任何函数(派生查询、公共表表达式、临时表插入、UPDATE语句都可以)。查看帖子末尾的标签,了解原因 任何问题都可以向我推荐。我找不到一个像我一样清晰的标题,结果是stackoverflow 用例示例 原始表:历史记录\u表\u快照 Value|Date 50 |01 50 |02 24 |03 50 |04 转换表:历史\表\范围 Value|DateStart|DateEnd 50 |01

我希望这可以在一个简单的SQL select语句中完成,而不需要该环境专用的任何函数(派生查询、公共表表达式、临时表插入、UPDATE语句都可以)。查看帖子末尾的标签,了解原因

任何问题都可以向我推荐。我找不到一个像我一样清晰的标题,结果是stackoverflow

用例示例 原始表:历史记录\u表\u快照

Value|Date
50   |01
50   |02
24   |03
50   |04
转换表:历史\表\范围

Value|DateStart|DateEnd
50   |01       |03
24   |03       |04
50   |04       |infinity
另外,让此查询处理其他复杂/高规模的用例(即历史表中的50列,除主键外的某些列可能为空)

滞后应起到以下作用:

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)

亚马逊红移有
lead()
lag()
吗?@a_horse_,没有名字。是的。编辑了转换表的值。抱歉搞混了。我觉得这很有趣。您没有这样做的原因是什么:
lead(date)over(order by date)
?我从
lag
开始,运行查询,发现订单被颠倒了。正如您所指出的,只要将
lag
替换为
lead
就更有意义了。这是一个多么烦人的例子。一个更干净的选项是first_value和last_value,而不是为偏移量计算而设计的lead或lag。上面的查询不会将结果作为转换后的表输出。我必须补充一点,这肯定会解决我的问题,并将它作为目前的解决方案。在许多业务案例中,快照表被设计使用的方式是,即使值没有更改,它也会上载一条新记录。我希望我能看到一个答案,即转换后的表也会规范化数据本身。