簡體   English   中英

MySql Select 行,日期相差 30 分鍾

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM