[英]MySql Select rows with 30 minutes difference in date
我有一個 MySql-8.0/MariaDb-10.4 表,其中包含不同訪問者的站點訪問列表:
我想創建一個查詢,該查詢返回每次訪問 session的第一次訪問,其中 session 定義是CreatedAt
日期為 30 分鍾或更長時間的位置。
因此,在我的情況下,我應該返回第 2 行(Id 列)、第 8 行和第 13 行。另請注意,只要每次訪問在不到 30 分鍾的時間內成功完成上一次訪問,session 可以超過 30 分鍾。
我的解決方案如下:
SELECT DISTINCT a.`CreatedAt`
FROM activities AS a
LEFT JOIN activities AS b
ON (
(UNIX_TIMESTAMP(b.`CreatedAt`) >= (UNIX_TIMESTAMP(a.`CreatedAt`) - (30 * 60)) ) AND
(b.`CreatedAt` < a.`CreatedAt`)
)
WHERE (b.`CreatedAt` IS NULL) AND (a.`VisitorId` = '26924c19-3cd1-411e-a771-5ebd6806fb27' /* or others for example */ )
它工作正常,但它不返回最后一行 13,我也不確定這是最好的解決方案。 提前致謝。
解決這個問題的最簡單方法是將所有訪問與他們早期的兄弟姐妹聯系起來,然后只選擇那些沒有的。 如果不存在以后的訪問(如您的 ID 13 示例),那么(更直觀的)其他方法(更直觀)采取每個具有較晚兄弟姐妹的方法將失敗。
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
我對@Eugen Rieck https://stackoverflow.com/a/61027502/625144有類似的回答。 但是使用MySQL
TIMESTAMPDIFF
function
SELECT a.*,
FROM activities a
LEFT JOIN activities b
ON b.VisitorId = a.VisitorId
AND a.Id > b.Id
AND TIMESTAMPDIFF(MINUTE, b.CreatedAt, a.CreatedAt) <= 30
WHERE
b.Id IS NULL
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.