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

Это ответ на этот вопрос MySql Выберите строки с 30-минутной разницей в дате , хотя и схожи по концепции, необходимое решение может быть другим.

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

enter image description here

Я хочу создать запрос, который возвращает последнее посещение каждого сеанса посещения , где определение сеанса - это когда 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

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

1 Ответ

1 голос
/ 26 апреля 2020

Это вариант проблемы разрыва и островов. Но вы можете справиться с этим, используя 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...