【问题标题】:MySql Select last row with 30 minutes difference in dateMySql 选择日期相差 30 分钟的最后一行
【发布时间】: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

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

【问题讨论】:

    标签: mysql sql mariadb


    【解决方案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函数的存在,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2018-09-07
    • 2017-09-23
    • 2014-02-08
    • 1970-01-01
    相关资源
    最近更新 更多