我希望在一个简单的SQL select语句中完成,而不需要任何该环境独有的函数(派生查询,公共表表达式,临时表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列,除了主键之外可能有一些列为null)
答案 0 :(得分:1)
lag
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)