MySql Выберите строки с 30-минутной разницей в дате - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть таблица MySql -8.0 / MariaDb-10.4, которая содержит список посещений различных посетителей:

enter image description here

Я хочу создать запрос, который возвращает первое посещение каждого сеанса посещения , где определение сеанса - это, где CreatedAt дата составляет 30 минут или более от предыдущих посещений.

Так что в моем случае я должен возвращать строку 2 (столбец Id), строку 8 и строку 13. Обратите внимание также, что сеанс может длиться более 30 минут, если каждое посещение предшествует предыдущему посещению менее чем за 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, также я не уверен, что это лучшее решение. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

Самый простой способ сделать это - связать все посещения с их ранее братьями и сестрами, а затем выбрать только тех, у которых их нет. Другой (более интуитивный) другой подход - взять кулак каждого, у которого есть более поздний родной брат, потерпит неудачу, если не будет более позднего посещения (как в вашем примере с 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
1 голос
/ 04 апреля 2020

У меня есть аналогичный ответ на @Eugen Rieck { ссылка }. Но используя MySQL TIMESTAMPDIFF функцию

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
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...