Объедините даты для разных идентификаторов, когда начало и конец находятся в разных строках и столбцах - PullRequest
0 голосов
/ 03 октября 2019

У меня есть таблица, в которой у одного человека есть несколько строк разных сеансов с датами начала и окончания. Дата окончания в первой строке может совпадать с датой начала в следующей строке, и поэтому я хочу объединить их в одну строку, поскольку сеанс фактически продолжается. Я использую MySQL, но версия 5.7 и обновление для использования более поздней версии невозможно.

Это пример того, что у меня есть: **** Редактировать с примером, когда один и тот же пользователь имеет несколько сеансов:

create table dates (USER_ID varchar(100),
                         start datetime,
                         end datetime);

insert into dates values ('1','2014-06-01','2014-07-01');
insert into dates values ('1','2014-07-01','2014-08-01');
insert into dates values ('1','2014-08-01','2014-09-01');
insert into dates values ('2','2014-07-01','2014-08-01');
insert into dates values ('2','2014-08-01','2014-09-01');
insert into dates values ('2','2014-10-01','2014-11-01');

+---------+---------------------+---------------------+
| USER_ID | start               | end                 |
+---------+---------------------+---------------------+
| 1       | 2014-06-01 00:00:00 | 2014-07-01 00:00:00 |
| 1       | 2014-07-01 00:00:00 | 2014-08-01 00:00:00 |
| 1       | 2014-08-01 00:00:00 | 2014-09-01 00:00:00 |
| 2       | 2014-07-01 00:00:00 | 2014-08-01 00:00:00 |
| 2       | 2014-08-01 00:00:00 | 2014-09-01 00:00:00 |
| 2       | 2014-10-01 00:00:00 | 2014-11-01 00:00:00 |
+---------+---------------------+---------------------+

Это то, что я хочу, а не просто минимальная / максимальная дата для каждого USER_ID

+---------+---------------------+---------------------+
| USER_ID | start               | end                 |
+---------+---------------------+---------------------+
| 1       | 2014-06-01 00:00:00 | 2014-09-01 00:00:00 |
| 2       | 2014-07-01 00:00:00 | 2014-09-01 00:00:00 |
| 2       | 2014-10-01 00:00:00 | 2014-11-01 00:00:00 |
+---------+---------------------+---------------------+

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 03 октября 2019

использовать агрегацию и группировать по

select user_id, min(start) as start, max(end) as end
from tablename
group by user_id
0 голосов
/ 03 октября 2019

Это проблема пробелов и островков. Я рекомендую решить эту проблему, используя левое соединение, чтобы определить, где начинаются и затем агрегируются острова:

select user_id, min(start), max(end)
from (select t.*,
             sum(tprev.user_id is null) over (partition by t.user_id order by t.start) as grp
      from t left join
           t tprev
           on tprev.user_id = t.user_id and
              tprev.end = t.start
     ) t
group by user_id, grp;

В этом решении используются оконные функции, которые были доступны с момента выпуска MySQL 8.

...