MySql 选择日期相差 30 分钟的最后一行

Posted

技术标签:

【中文标题】MySql 选择日期相差 30 分钟的最后一行【英文标题】:MySql Select last row with 30 minutes difference in date 【发布时间】:2020-04-26 15:41:35 【问题描述】:

这是对这个问题mysql Select rows with 30 minutes difference in date 的后续跟进,尽管概念相似,但所需的解决方案可能不同。

我有一个 MySql-8.0/MariaDb-10.4 表,其中包含不同访问者的站点访问列表:

我想创建一个查询,返回每次访问会话上次访问,其中会话定义是CreatedAt 日期为 30 分钟或更长时间的位置以前的访问。

所以在我的情况下,我应该返回第 7 行(Id 列)、第 12 行和第 13 行。另请注意,会话可以超过 30 分钟,只要每次访问都在少于 30 分钟的情况下成功.

@EugenRieck 提出的简洁解决方案如下:

SELECT
  late.*
FROM activities AS late
LEFT JOIN activities AS early
  ON late.VisitorId=early.VisitorId
  AND late.CreatedAt>early.CreatedAt
  AND late.CreatedAt<=DATE_ADD(early.CreatedAt, INTERVAL +30 MINUTE)
WHERE early.Id IS NULL
-- Maybe: AND late.VisitorId='26924c19-3cd1-411e-a771-5ebd6806fb27'
-- Maybe: ORDER BY late.CreatedAt

效果很好,但它通过在每次访问会话中返回第一次访问而不是最后一次访问来工作。我试图修改为我想要的工作,但没有运气。请帮忙。

【问题讨论】:

【参考方案1】:

这是间隙和孤岛问题的变体。但是您可以使用lead() 处理它。只需检查下一个createdAt 是否距离给定行中的值超过 30 分钟。这是会话的最后一行:

select a.*
from (select a.*,
             lead(createdAt) over (partition by visitorid order by createdat) as next_ca
      from activities a
     ) a
where next_ca > createdAt + interval 30 minute;

通常,在这种情况下,您也需要最后一行。您可以通过 or next_ca is null 获得。

【讨论】:

好东西,一开始就不知道lead函数的存在,谢谢

以上是关于MySql 选择日期相差 30 分钟的最后一行的主要内容,如果未能解决你的问题,请参考以下文章

从彼此相差不超过 x 分钟的日期中选择最晚的日期

如何在php/codeigniter或mysql中获得两个相差20分钟的日期的所有组合

MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数

MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数

MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数

怎样得出sql中日期差