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

时间:2020-04-26 15:41:35

标签: mysql sql mariadb

这是该问题MySql Select rows with 30 minutes difference in date的后续内容,尽管概念相似,但所需的解决方案可能有所不同。

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

enter image description here

我想创建一个查询,该查询返回每次访问会话最后次访问,其中会话定义是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 个答案:

答案 0 :(得分: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来获得。