【问题标题】:query to get data between date ranges and the padded data around查询以获取日期范围和填充数据之间的数据
【发布时间】:2021-09-14 19:54:47
【问题描述】:

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

...
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'

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

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

【问题讨论】:

  • “前后一个日期”是什么意思?一整天 24 小时,还是那些日子的开始和结束,还是一排?
  • 前后一行,表格按日期时间排序
  • 那么@GordonLinoff 的答案是正确的。您可能希望在子查询内部添加一个额外的WHERE 过滤器以提高效率,否则LEADLAG 将在整个表上计算

标签: sql sql-server tsql


【解决方案1】:

您可以使用lead()lag()

SELECT *
FROM (SELECT t.*,
             LAG(DATETIME, 1, DATETIME) OVER (ORDER BY DATETIME) as PREV_DATETIME,
             LEAD(DATETIME, 1, DATETIME) OVER (ORDER BY DATETIME) as NEXT_DATETIME
      FROM MYTABLE t
     ) t
WHERE NEXT_DATETIME >= '2018-01-01 03:00:00' AND
      PREV_DATETIME <= '2018-01-01 10:00:00'

注意:这里使用默认值来简化逻辑。

Here 是一个 dbfiddle。根据您指定的结果,我将最后一个比较从 &lt; 更改为 &lt;=

【讨论】:

  • 谢谢,没想到这么快就回复了。我明天要试试这个
【解决方案2】:

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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-30
    • 2019-02-10
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多