我希望这在一个简单的 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/