根据日期获取上一行值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据日期获取上一行值相关的知识,希望对你有一定的参考价值。

我是SQL世界的新手,所以这可能是基本的,但我试图根据给定的时间范围获得先前的行(多个)值。

我有一个数据库表(书签),它捕获吃掉的食物,并希望评估给定时间段内的所有先前行,以了解消费的食物是否已引起过敏。

因此对于例如当我运行以下查询时: -

SELECT food_word_1, date, lag(food_word_1,1) OVER (ORDER BY date) as maybe_this FROM bookmark WHERE mood = 'allergies'

结果如下: -

 food_word_1 |            date            | maybe_this 
-------------+----------------------------+------------
 bread       | 2018-11-14 09:30:54.272882 | 
 coffee      | 2018-11-15 12:49:46.119737 | bread
 beef        | 2018-11-15 20:22:51.924697 | coffee
 pasta       | 2018-11-15 20:23:21.579621 | beef
 cereal bar  | 2018-11-16 07:53:22.098064 | pasta
 red wine    | 2018-11-16 09:03:29.589634 | cereal bar
 nuts        | 2018-11-20 07:43:17.910149 | red wine
 duck        | 2018-11-21 12:38:31.463169 | nuts
 cereal bar  | 2018-11-25 09:09:54.187615 | duck
 salad       | 2018-12-12 21:53:47.258954 | cereal bar

所以'面包'在'咖啡'之前被吃掉/输入(也许是这个)1行(Food_word_1)。

我在这里使用滞后函数,但我不确定这是正确的方法,但它显示了我想要实现的内容,而不是定义要评估的先前行的确切数量(因此在这种情况下使用滞后功能),我希望选择36小时的时间段。

任何帮助,赞赏,

MD

答案

您可以在自我左加入后使用stringagg将所有这些列表列为大列表:

select t1.food_word_1 , t1.date, 
       string_agg(t2.food_word_1,',') as also_maybe -- make the list
from MyTable t1
left join MyTable t2
  on t2.date >= t1.date - (36 * interval '1 hour') -- the previous 36 hours
  and t1.food_word_1 <> t2.food_word_1 -- let's ignore the food we've already listed in column 1
  and t2.mood = 'allergies' -- limit the results for the list
where t1.mood = 'allergies' -- limit the results for each group
group by t1.food_word_1, t1.date

以上是关于根据日期获取上一行值的主要内容,如果未能解决你的问题,请参考以下文章

填写缺失的日期值并根据前一行填充第二列

根据上一行中的值计算 MariaDB 中的新值

SQL根据连续日期获取值的变化

根据雪花中的字段值获取每个日期和数据透视表的最后一个值

另一种根据日期值获取最新记录的方法

Python:如何根据日期时间获取值的计数