2017-02-14 4 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時から11:00 3に車が信号を送信し始めているし、車両1が所定の位置10から始まっ?どの場所からの期間からデータを送信して開始されているどのように多くの車を知りたいです車両4は場所12から、車両3は場所15から、そして11時から12時の間に車両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 

しかし、これは起源の場所のみを取得する方法です(車のID 1は場所10から発信されるため、場所10の下でカウントされることを意味します)。

+0

これは実際にJavaと関係がありますか? – RealSkeptic

+0

@RealSkepticいいえSQLが十分に強力でない場合は、Javaで試すことができます –

答えて

0

Hmmm。 。 。

あなたは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

解決策がグループではないと思います。なぜなら、1つのグループに入るためには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; 
関連する問題