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

问题描述:

我希望在一个简单的SQL select语句内完成,而不包含任何对该环境唯一的函数(派生查询,公用表表达式,temp表INSERT,UPDATE语句可以)。在帖子末尾查看我的标签以了解原因。转换历史表以使用范围日期(从和到日期)而不是快照日期

引用任何有问题的问题。我无法找到与我的结果一样清晰的标题。的使用情况下

例 原稿台: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列中的其它复杂/高比例的用例历史表可能会出现一些列,除了主键为空)

+0

是否亚马逊红移有'铅()'和'滞后()'? –

+0

@a_horse_with_no_name。 。 。是的,它确实。 –

+0

编辑转换表的值。对困惑感到抱歉。 – softdevlife

lagwindow function应该做的伎俩:

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

编辑:
正如戈登·利诺夫在评论中指出的那样,只是用lead会更清洁:

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

我觉得这很有趣。你有没有这样做的理由:'领导(日期)结束(按日期排序)'? –

+0

我从'lag'开始,运行查询,发现我的订单已经颠倒过来。正如你所指出的 - 只需用'lead'替换'lag'会更有意义。多么令人讨厌的[知觉失明]的例子(http://en.wikipedia.org/wiki/Inattentional_blindness)。 – Mureinik

+0

一个更干净的选项可能是first_value和last_value,而不是专门用于偏移计算的lead或lag。 – Guy