这是对这个问题MySql Select rows with 30 minutes difference in date的后续,尽管在概念上类似--所需的解决方案可能有所不同。
我有一个MySQL8.0/MariaDB10.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
它工作得很好,但它的工作方式是在每次访问会话中返回第一次访问,而不是返回最后一次访问。我试着按照我的意愿修改工作,但没有运气。请帮帮忙。
发布于 2020-04-26 15:44:07
这是一个差距和岛屿问题的变体。但是您可以使用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
那里得到它。
https://stackoverflow.com/questions/61443546
复制相似问题