sql - 查询以获取日期范围和填充数据之间的数据
问题描述
假设这是我在数据库表中的数据
...
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'
我还希望查询在此范围之前和之后返回一个日期。就像填充的日期一样。
现在我怎样才能有效地做到这一点。一种方法可能是获取范围内的日期,然后获取小于最小日期的所有数据,并获取其中的最高日期时间并添加到主范围表中,同时对最大日期重复此过程。还有其他方法吗?
解决方案
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'
推荐阅读
- javascript - 在 BigQuery 中插入时嵌套在数组中的 JSON 对象出现问题
- visual-studio-code - 带有 git 子模块的 VSCode 给出错误
- python - 如何自动在熊猫上构建多船长
- c# - WCF 传输安全,匿名访问的消息加密
- javascript - 单击外部元素时隐藏元素?
- vba - ADODB.Connection:分隔符分号不适用于 csv 文本文件
- reactjs - Preact 子组件中何时使用 Props 以及何时使用 State
- wordpress - 由于 cPanel 或服务器,无法覆盖 Wordpress 中的 404 页面
- php - 我可以获取 Laravel 的护照登录方法来检查用户表中的验证字段吗?
- r - dplyr::mutate 中的矩阵乘法