SQL - группировка по проблеме - PullRequest
0 голосов
/ 26 января 2012

У меня есть таблица с записями в форме (упрощенно): ID (int), startTime (DateTime), endTime (DateTime)

Я хочу иметь возможность группировать записи, которые «перекрываются» по временипродолжительность за минуту.Пример:

1 - 12.00.AM - 12.10.AM ( duration here is 10 min)
2 - 12.05.AM - 12.07.AM (duration here is 2 minutes but is overlapping with record ID = 1 in minutes 05, 06, 07)

The result of such a query should be 
minute 12.00 - record 1, 
minute 12.01 - record 1, 
... 
minute 12.05 - record 1 + record 2, 
minute 12.06 - record 1 + record 2, 
minute 12.07 - record 1 + record 2 
... 
minute 12.10 - record 1

Примечание Я использую SQL Server (2005 и выше)

1 Ответ

2 голосов
/ 26 января 2012

Это один из способов сделать это в Oracle (11g Release 2, поскольку он включает в себя функцию LISTAGG):

with CTE as
       (    select STRT + (rownum - 1) / 24 / 60 as TIMES
              from (select min(STARTTIME) as STRT from FORM1)
        connect by level <=
                     (select (max(ENDTIME) - min(STARTTIME)) * 24 * 60
                        from FORM1))
  select to_char(CTE.TIMES, 'hh24:mi') as MINUTE
        ,LISTAGG(ID, ',') within group (order by ID) as IDS
    from   CTE
         join
           FORM1
         on CTE.TIMES <= FORM1.ENDTIME and CTE.TIMES >= FORM1.STARTTIME
group by to_char(CTE.TIMES, 'hh24:mi')
order by to_char(CTE.TIMES, 'hh24:mi')

Я использовал следующие тестовые данные:

create table FORM1
(
  ID          number
 ,STARTTIME   date
 ,ENDTIME     date
);

insert into FORM1
     values (
              1
             ,to_date('26/01/2012 00:00:00', 'dd/mm/yyyy hh24:mi:ss')
             ,to_date('26/01/2012 00:10:00', 'dd/mm/yyyy hh24:mi:ss'));

insert into FORM1
     values (
              2
             ,to_date('26/01/2012 00:05:00', 'dd/mm/yyyy hh24:mi:ss')
             ,to_date('26/01/2012 00:07:00', 'dd/mm/yyyy hh24:mi:ss'));

И я получаю следующий результат:

Minute  IDs
00:00   1
00:01   1
00:02   1
00:03   1
00:04   1
00:05   1,2
00:06   1,2
00:07   1,2
00:08   1
00:09   1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...