使用窗口函数根据时间搜索行

Posted

技术标签:

【中文标题】使用窗口函数根据时间搜索行【英文标题】:Using Window Functions to search back through rows based on time 【发布时间】:2019-02-04 20:14:39 【问题描述】:

我是 SQL 新手,并且一直在努力了解如何根据时间向后搜索前几行。

我发现 Windows Lag Function 在这里可能对我有帮助,但我还没有找到一种方法来定义它的搜索时间段。

如果我输入:-

SELECT food_word_1, 
       date, 
       lead(food_word_1,2) OVER (ORDER BY date DESC) as prev_food_word_1 
FROM bookmark 
WHERE mood = 'allergies'"

结果如下所示:-

food_word_1 |            date            | prev_food_word_1 
-------------+----------------------------+------------------
 burritos    | 2019-02-01 09:56:40.943341 | 
 burritos    | 2019-02-01 09:56:31.56869  | 
 burritos    | 2019-02-01 09:56:31.34883  | burritos
 cereal bar  | 2019-01-10 07:24:29.602226 | burritos
 almonds     | 2019-01-09 08:37:34.223448 | burritos
 fennel      | 2019-01-09 08:35:44.186134 | cereal bar

我得到一个搜索回 2 行的结果,但我想做的是向后搜索(滞后)36 小时前的行,而不是我必须定义没有时间关联的行数。

请问有人知道最好的方法吗?

谢谢

【问题讨论】:

样本数据真的很有帮助。 【参考方案1】:

此答案适用于 Oracle,因为该问题最初标记为 Oracle。

Oracle 支持带有数字范围的range between,但这些也可用于日期。试试这个:

SELECT food_word_1, 
       date, 
       lead(food_word_1) OVER (ORDER BY date DESC RANGE BETWEEN 1.5 PRECEDING AND CURRENT ROW) as prev_food_word_1 
FROM bookmark 
WHERE mood = 'allergies';

【讨论】:

非常感谢 Gordon 的评论和想法,但我没有添加(抱歉)我正在使用 POSTGRES,在尝试了这个并搜索了一个等价物之后,我无法让它工作。我不确定我是否使用“滞后”功能朝着正确的方向前进,但我会继续试验,非常感谢任何进一步的指针。

以上是关于使用窗口函数根据时间搜索行的主要内容,如果未能解决你的问题,请参考以下文章

使用 ROW_NUMBER() 窗口函数选择行

hive窗口函数总结

如果为空,则在窗口函数的分区子句中使用默认值

如何使用窗口函数引用输出行?

如何根据滚动的 30 天窗口 SQL 选择行

创建“部分”窗口函数以更新 SQL Server 中的数据