2013-08-16 5 views
3

У меня есть таблица vehicle_fact с полями start_Date_Time, end_date_time, location и driver_id. Моя цель - получить счет остановки, дату начала, дату окончания на основе driver_id и местоположения.Группировка записей

таблица выглядит следующим образом,

start_Date_Time   end_date_time   LOCATION driver_id 
---------------   -------------   -------- --------- 
11/08/2013 06:51:53  11/08/2013 07:06:50   loc1  2 
11/08/2013 09:00:15  11/08/2013 09:16:37   loc2  2 
11/08/2013 09:41:16  11/08/2013 09:50:03   loc1  2 
11/08/2013 09:53:28  11/08/2013 10:01:27   loc1  2 
11/08/2013 10:41:31  11/08/2013 10:45:45   loc2  2 
11/08/2013 11:25:54  11/08/2013 11:38:55   loc1  2 
11/08/2013 14:45:08  11/08/2013 14:54:52   loc2  3 
11/08/2013 15:20:45  11/08/2013 15:28:29   loc2  3 
11/08/2013 15:30:39  11/08/2013 15:31:59   loc1  3 
11/08/2013 16:25:24  11/08/2013 16:25:35   loc1  3 
11/08/2013 20:26:35  12/08/2013 01:51:19   loc1  3 

Желаемый результат должен быть:

start_Date_Time   end_date_time   LOCATION driver_id count 
11/08/2013 06:51:53  11/08/2013 07:06:50  loc1  2   1 
11/08/2013 09:00:15  11/08/2013 09:16:37  loc2  2   1 
11/08/2013 09:41:16  11/08/2013 10:01:27  loc1  2   2 
11/08/2013 10:41:31  11/08/2013 10:45:45  loc2  2   1 
11/08/2013 11:25:54  11/08/2013 11:38:55  loc1  2   1 
11/08/2013 14:45:08  11/08/2013 15:28:29  loc2  3   2 
11/08/2013 15:30:39  12/08/2013 01:51:19  loc1  3   3 

Можно ли это сделать в SQL.

Большое спасибо за помощь.

+0

Независимо от логики вы использовали в переднем конце может быть оформлена в 'сохраняемого Procedure'. Извините, я не конвертер. – Romesh

+0

Что вы подразумеваете под номером стоп-кадра? – zxc

+0

Привет, Bew, Это простаивающий автомобиль (когда зажигание выключено). – Dba

ответ

3

В этом запросе внутренний подзапрос GRP подсчитывает записи до текущей с различными Driver_id или Location так для одних и тех же Driver_id,Location записей следовали один за другим, мы получаем тот же GRP счет. то мы просто группируем по Driver_id,Location и GRP.

select min(START_DATE_TIME), 
     Max(END_DATE_TIME), 
     LOCATION, 
     DRIVER_ID, 
     count(*) cnt 
FROM 
(
select t1.*, 
(select count(*) 
    from vehicle_fact t2 
    where (t2.End_date_time<t1.End_date_time) 
    and 
    (
    (t2.location<>t1.location) 
     OR 
    (t2.driver_id <>t1.driver_id) 
    ) 
) Grp 

from vehicle_fact t1 
) T3 

GROUP BY LOCATION,DRIVER_ID,GRP 
    order by min(START_DATE_TIME) 

SQLFiddle demo

+0

Спасибо Valex :). Это работает отлично. Большое спасибо. – Dba

-1
select start_Date_Time, end_date_time, LOCATION, driver_id 
, (select count(*) 
     from table t2 
     where 
      t1.driver_id=t2.driver_id 
     and t1.LOCATION=t2.LOCATION 
    ) 
from table t1 
order by t1.driver_id asc 

может быть таким, если я правильно понимаю u.

+0

он дает неправильный вывод –