发布
社区首页 >问答首页 >MySql选择日期相差30分钟的最后一行

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

Stack Overflow用户
提问于 2020-04-26 15:41:35
回答 1查看 196关注 0票数 0

这是对这个问题MySql Select rows with 30 minutes difference in date的后续,尽管在概念上类似--所需的解决方案可能有所不同。

我有一个MySQL8.0/MariaDB10.4表,其中包含不同访问者的网站访问列表:

我想要创建一个查询,返回最后一次访问的每次访问会话,其中会话定义为CreatedAt日期为30分钟或更长的时间。

因此,在我的例子中,我应该返回第7行(Id列)、第12行和第13行。还请注意,一个会话可以超过30分钟,只要每次访问结束前一次访问少于30分钟。

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

代码语言:javascript
代码运行次数:0
复制
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

它工作得很好,但它的工作方式是在每次访问会话中返回第一次访问,而不是返回最后一次访问。我试着按照我的意愿修改工作,但没有运气。请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-26 15:44:07

这是一个差距和岛屿问题的变体。但是您可以使用lead()来处理它。只需检查下一个createdAt是否与给定行中的值相隔30分钟。这是会话的最后一行:

代码语言:javascript
代码运行次数:0
复制
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那里得到它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61443546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档