2017-02-14 1 views
0

У меня есть стол, в котором есть вход каждого транспортного средства в разное время.Как получить количество транспортных средств, запущенных с каждого места

vehicle_ id   time     place 
____________  _____    ________ 
    1  2016-09-01 10:00:00   10 
    2  2016-09-01 10:00:00   12 
    1  2016-09-01 10:01:00   10 
    1  2016-09-01 10:01:10   10 
    3  2016-09-01 10:02:00   15 
    2  2016-09-01 10:03:00   18 
    1  2016-09-01 10:03:00   12 
    2  2016-09-01 10:04:00   10 
    2  2016-09-01 10:05:00   10 
    1  2016-09-01 10:06:00   15 
    2  2016-09-01 10:07:00   18 
    3  2016-09-01 10:09:00   19 
    4  2016-09-01 11:06:00   15 
    1  2016-09-01 11:07:00   18 
    3  2016-09-01 11:09:00   19 
    4  2016-09-01 11:10:00   15 
    2  2016-09-01 11:11:00   18 
    6  2016-09-01 11:12:00   19 
    4  2016-09-01 11:16:00   15 
    5  2016-09-01 11:17:00   18 
    3  2016-09-01 11:19:00   19 

Я хочу знать, сколько автомобилей были начаты передачами данных из периода времени, от которого место? Например с 10:00 до 11:00 3 транспортных средств начали посылать сигналы и автомобиль 1 начал с места 10 и транспортное средство 2 из места 12 и транспортное средство 3 с места 15. И с 11:00 до 12:00 транспортное средство 4 начиналось с места 15, а транспортное средство 5 начиналось с места 18, а транспортное средство 6 начиналось с места 19.

Таким образом, окончательный выход будет

For 10-11 

place   vehicle_count 
_____   _____________ 
10    1 
12    1 
15    1 
For 11-12 

place   vehicle_count 
_____   _____________ 
15    1(vehicle_id 4) 
18    1(vehicle_id 5) 
19    1(vehicle_id 6) 
For 10-12 

place   vehicle_count 
_____   _____________ 
10    1(vehicle_id 1) 
12    1(vehicle_id 2) 
15    2(vehicle_id 3,4) 
18    1(vehicle_id 5) 
19    1(vehicle_id 6) 

Я сделал

select count(distinct(vehicle_id)) from public.datatable where time>=2016-09-01 10:00:00 and time<2016-09-01 11:00:00 

Но это дает отсчет от всех мест, но как получить только места происхождения. (Что означает транспортное средство идентификатор 1 происходит от места 10, так что следует учитывать при месте 10 только) .Any помощи ценятся

+0

Это действительно имеет отношение к Java? – RealSkeptic

+0

@RealSkeptic Нет. Я спросил, что если SQL недостаточно мощный, то можете попробовать с JAVA –

ответ

0

Хммм. , ,

Вы можете получить первое место для каждого транспортного средства в течение периода времени с использованием distinct on, а затем агрегировать получить place:

select place, count(*) 
from (select distinct on (vehicle_id) dt.* 
     from public.datatable dt 
     where time >= '2016-09-01 10:00:00' and time < '2016-09-01 11:00:00' 
     order by vehicle_id, time 
    ) v 
group by place; 
0

Что вам нужно, это GROUP BY:

select place, count(*) 
from public.datatable 
where 
time>=2016-09-01 10:00:00 and 
time<2016-09-01 11:00:00 
GROUP BY place 
+1

. Я не думаю, что решение будет группой, потому что мне нужно, чтобы один автомобиль попал только в одну группу. Но ваш запрос группирует все записи транспортных средств в местах –

0
select place, 
    count(distinct vehicle_id) from t t1 
where 
    tim>=to_date('2016-09-01 10:00:00','yyyy-mm-dd HH:MI:SS') and 
    tim<to_date('2016-09-01 12:00:00','yyyy-mm-dd HH:MI:SS') 
    and not exists (select * from t t2 where t1.tim >t2.tim and t1.vehicle_id=t2.vehicle_id) 
group by t1.place 
order by t1.place;