2012-01-26 4 views
0

У меня есть таблица, которая содержит записи в виде (упрощенно): ID (INT), начальное время (DateTime), Конечное время (DateTime)SQL - группа по вопросу

Я хочу, чтобы иметь возможность группировать записи, что " перекрытие "продолжительностью по минутам. Ex:

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 uppwards)

ответ

2

Это один из способов сделать это в 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 
+0

Впечатляющий (и очень быстро) ответ, к сожалению, это не будет работать на SQL Server. Обновлен тег, чтобы отразить это. – Ghita

Смежные вопросы