[英]MySql Select last row with 30 minutes difference in date
這是此問題MySql Select 行的后續,日期相差 30 分鍾,盡管概念相似,但所需的解決方案可能不同。
我有一個 MySql-8.0/MariaDb-10.4 表,其中包含不同訪問者的站點訪問列表:
我想創建一個查詢,該查詢返回每次訪問的最后一次訪問 session ,其中 session 定義是CreatedAt
日期是上次訪問 30 分鍾或更長時間的地方。
因此,在我的情況下,我應該返回第 7 行(Id 列)、第 12 行和第 13 行。另請注意,只要每次訪問在不到 30 分鍾的時間內成功完成上一次訪問,session 可以超過 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
它工作得很好,但它的工作原理是在每次訪問 session 中返回第一次訪問,而不是最后一次訪問。 我試圖修改為我想要的工作,但沒有運氣。 請幫忙。
這是間隙和孤島問題的變體。 但是您可以使用lead()
來處理它。 只需檢查下一個createdAt
是否距離給定行中的值超過 30 分鍾。 這是 session 的最后一行:
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.