Как найти последовательные интервалы в таблице mysql - PullRequest
0 голосов
/ 17 июня 2020

У меня есть таблица посещения с полями: personId , date

+----------+------------+
| personId |    date    |
+----------+------------+
|        1 | 2020-05-04 |
|        1 | 2020-05-05 |
|        1 | 2020-05-06 |
|        1 | 2020-05-08 |
|        1 | 2020-05-09 |
|        2 | 2020-05-03 |
|        2 | 2020-05-04 |
|        2 | 2020-05-07 |
+----------+------------+

personId + date уникальны, не может быть двумя записями с одинаковой датой и personId

Возникает вопрос: как создать mySQL запрос, который будет отображать интервалы последовательных посещений

+----------+------------+------------+-------+
| personId | dateStart  |  dateEnd   | count |
+----------+------------+------------+-------+
|        1 | 2020-05-04 | 2020-05-06 |     3 |
|        1 | 2020-05-08 | 2020-05-09 |     2 |
|        2 | 2020-05-03 | 2020-05-04 |     2 |
|        2 | 2020-05-07 | 2020-05-07 |     1 |
+----------+------------+------------+-------+

Я обнаружил несколько похожих проблем, но все они имеют некоторые особые отличия, поэтому я не знаю точно, как применить их в моем случае, и был бы признателен за пример в соответствии со структурой моей таблицы

1 Ответ

0 голосов
/ 17 июня 2020
SELECT 
  pairs.person_id, 
  pairs.startDate, 
  pairs.endDate, 
  pairs.endDate - pairs.startDate + 1 as count 
FROM
(SELECT 
  t1.person_id, 
  t1.date as startDate, 
  MIN(t3.date) as endDate 
FROM visits as t1
   LEFT JOIN visits as t2 ON 
     t1.person_id = t2.person_id AND 
     t1.date - t2.date = 1
   LEFT JOIN visits as t3 ON 
     t1.person_id = t3.person_id AND 
     t1.date <= t3.date
     LEFT JOIN visits as t4 ON 
       t3.person_id = t4.person_id AND 
       t3.date - t4.date = -1
WHERE ISNULL(t2.date) AND ISNULL(t4.date)
GROUP BY t1.person_id, t1.date
) as pairs

объяснение:

1) Мы находим записи (t1), у которых нет предыдущей даты (t2)

2) Давайте соединим записи t1 с записями (t3), которые нет следующей даты

3) Для каждой даты из t1 найдем минимум из t3

Вот и все

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