首页 > 解决方案 > 查询以获取日期范围和填充数据之间的数据

问题描述

假设这是我在数据库表中的数据

...
01/01/2016 00:00    367.2647688
01/06/2016 12:30    739.8067639 < INCLUDE THIS
01/01/2018 03:00    412.9686137
01/01/2018 03:30    150.6068046
01/01/2018 04:00    79.22204568
01/01/2018 04:30    648.702222
01/01/2018 09:00    75.41931365
01/01/2018 09:30    923.9435812
01/01/2018 10:00    342.9116004
02/01/2018 02:00    776.4855197 < INCLUDE THIS
08/04/2021 02:30    206.2066933
02/01/2022 03:00    852.9874735
02/01/2022 03:30    586.0818207
02/01/2022 04:00    363.5394613
02/01/2023 04:30    874.3073237
...

这是我获取数据的查询

SELECT * FROM MYTABLE WHERE [DATETIME] >= '2018/01/01 03:00' AND [DATETIME] < '2018/01/01 11:00'

我还希望查询在此范围之前和之后返回一个日期。就像填充的日期一样。

现在我怎样才能有效地做到这一点。一种方法可能是获取范围内的日期,然后获取小于最小日期的所有数据,并获取其中的最高日期时间并添加到主范围表中,同时对最大日期重复此过程。还有其他方法吗?

标签: sqlsql-servertsql

解决方案


Lag 和 Lead 是窗口函数,用于获取其分区内任何行的前后值。因此,当我们想要超出范围的焊盘行时,我们可以在滞后和超前函数中设置偏移参数。

SELECT t.Datetime,t.val FROM (SELECT T.*,LAG(Datetime,1,Datetime) over (order by Datetime) as lagdate,lead(Datetime,1,Datetime)over (order by Datetime) as leaddate FROM Mytable T)t
WHERE leaddate>= '2018/01/01 03:00' and lagdate<='2018/01/01 11:00'

推荐阅读