sql - Firebird 查询 - 包含下一行的值

标签 sql firebird

我有一个包含以下列的表格(非常简化):

CustomerID | ValidFrom | ValidTo
----------------------------------
1          | 20180101  | 20180330
2          | 20180601  | 20181003
1          | 20180212  | 20180313

我发现一个查询可以实现以下结果:

CustomerID | ValidFrom
-----------------------
1          | 20180101
1          | 20180212
1          | 20180314
1          | 20180331
2          | 20180601   
2          | 20181004

查询:

SELECT CustomerID, ValidFrom
FROM table
UNION
SELECT CustomerID, ValidTo + 1
FROM table

但是我怎样才能实现以下结果(几乎是上一行中包含的下一行的值)?

CustomerID | ValidFrom | ValidTo
---------------------------------
1          | 20180101  | 20180211
1          | 20180212  | 20180313
1          | 20180314  | 20180330
1          | 20180331  | NULL
2          | 20180601  | 20181003
2          | 20181004  | NULL

非常感谢!

最佳答案

您可以使用 SQL window functions 获取第二个查询的结果:

select
    validfrom
  , lag(validfrom,1) over (partition by customerId, order by validFrom)
  from (
      SELECT CustomerID, ValidFrom
      FROM table
      UNION
      SELECT CustomerID, ValidTo + 1
      FROM table
  ) foo

关于sql - Firebird 查询 - 包含下一行的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52834846/

相关文章:

mysql - 一次性更新和选择

php - 阻止 SELECT 直到结果可用

mysql - 获取具有相似声音的记录

firebird - GDS 异常(exception)。 335544421.连接被远程接口(interface)拒绝

java - Spring hibernate java.sql.SQLException : The result set is closed

PHP 没有连接到 firebird (interbase) 数据库

sql - 将错误行发送到其他表

delphi - 服务器更新后如何在没有断开连接和重新连接的情况下刷新客户端上的查询

database - 在数据库中存储具有可变数量字段的测量值的最有效方法是什么?

python - Sqlite3 通过提供年和月搜索列