2017-06-13 3 views
0

HAWQ。イン/アウト時間で行を結合する方法私は、これはあなたが達成しようとしているものであると考えていHAWQ。入出庫時に行の入/出力に参加する

シンプル

enter image description here

おかげ

+0

2番目の行はid_inが3ではなく4であるべきですか?あなたのサンプルデータには、car_id = 1のレコードが4つありますが、レコードは3つあります。あなたはid = 3の代わりにid = 4でなければならないとどう決めましたか? –

+0

現在、私はデータを消去しています。 'in'は2月18日と25日に、 'out'は27時にのみ表示されます。 – Kobra

答えて

1

。トリックは、ウィンドウ関数 "row_number()"を使用することです。

select sub1.car_id, sub1.id_in, sub1.cross_date_time_in, sub2.id_out, sub2.cross_date_time_out 
from (
     select car_id, id as id_in, 
      cross_date_time as cross_date_time_in, 
      row_number() over (partition by car_id order by cross_date_time) as row_num 
     from source_table 
     where direction = 'in') as sub1 
     join (select car_id, id as id_out, 
        cross_date_time as cross_date_time_out, 
        row_number() over (partition by car_id order by cross_date_time) as row_num 
      from source_table 
      where direction = 'out') as sub2 on sub1.car_id = sub2.car_id and sub1.row_num = sub2.row_num; 

この形式を使用することもできますが、共通のテーブル式でも書き込むことができます。

with sub1 as (select car_id, id as id_in, cross_date_time as cross_date_time_in, 
       row_number() over (partition by car_id order by cross_date_time) as row_num 
       from source_table 
       where direction = 'in'), 
    sub2 as (select car_id, id as id_out, cross_date_time as cross_date_time_out, 
       row_number() over (partition by car_id order by cross_date_time) as row_num 
       from source_table 
       where direction = 'out') 
select sub1.car_id, sub1.id_in, sub1.cross_date_time_in, 
     sub2.id_out, sub2.cross_date_time_out 
from sub1 
join sub2 on sub1.car_id = sub2.car_id and sub1.row_num = sub2.row_num; 
+0

ありがとうございました 残念ながら、正しい結果は得られません。 誤った結果です。 1 1 2017-02-12 10:20:15.000000 1 2017-02-09 10:20:15.000000 – Kobra

0

create table source_table 
 
(
 
    id INT 
 
    ,car_id INT 
 
    ,direction text 
 
    ,cross_date_time TIMESTAMP 
 
); 
 
insert into source_table 
 
    values (1, 1,'in', to_timestamp('2017-02-02-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 1,'in', to_timestamp('2017-02-12-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 1,'in', to_timestamp('2017-02-18-10:20:15', 'yyyy-MM-dd hh:mi:ss'));; 
 
insert into source_table 
 
    values (1, 1,'in', to_timestamp('2017-02-25-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 1,'out', to_timestamp('2017-02-08-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 1,'out', to_timestamp('2017-02-09-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 1,'out', to_timestamp('2017-02-27-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 2,'in', to_timestamp('2017-02-02-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 2,'in', to_timestamp('2017-02-12-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 2,'in', to_timestamp('2017-02-18-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 2,'out', to_timestamp('2017-02-08-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 2,'out', to_timestamp('2017-02-14-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 2,'out', to_timestamp('2017-02-27-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 2,'out', to_timestamp('2017-02-29-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 3,'in', to_timestamp('2017-02-02-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 3,'in', to_timestamp('2017-02-12-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 3,'out', to_timestamp('2017-02-08-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 
insert into source_table 
 
    values (1, 3,'out', to_timestamp('2017-02-14-10:20:15', 'yyyy-MM-dd hh:mi:ss')); 
 

 

 

 
select sub1.car_id, sub1.id_in, sub1.cross_date_time_in, sub2.id_out, sub2.cross_date_time_out 
 
from (
 
     select car_id, id as id_in, 
 
      cross_date_time as cross_date_time_in, 
 
      row_number() over (partition by car_id order by cross_date_time) as row_num 
 
     from source_table 
 
     where direction = 'in') as sub1 
 
    join (select car_id, id as id_out, 
 
        cross_date_time as cross_date_time_out, 
 
        row_number() over (partition by car_id order by cross_date_time) as row_num 
 
      from source_table 
 
      where direction = 'out') as sub2 on sub1.car_id = sub2.car_id and sub1.row_num = sub2.row_num;

間違った結果。

1 1 2017年2月12日10:20:15.000000 1 2017年2月9日10:20:15.000000

左を使用する場合、変異体を結合:

select sub1.car_id, sub1.id_in, sub1.cross_date_time_in, sub2.id_out, sub2.cross_date_time_out 
 
from (
 
     select car_id, id as id_in, 
 
      cross_date_time as cross_date_time_in, 
 
      row_number() over (partition by car_id order by cross_date_time) as row_num 
 
     from source_table 
 
     where direction = 'in') as sub1 
 
    left join (select car_id, id as id_out, 
 
        cross_date_time as cross_date_time_out, 
 
        row_number() over (partition by car_id order by cross_date_time) as row_num 
 
      from source_table 
 
      where direction = 'out') as sub2 on sub1.car_id = sub2.car_id and sub1.row_num = sub2.row_num;

間違った結果: 1 1 2017-02-12 10:20:15.000000 1 2017-02-09 10:20:15.000000 1 1 2017-02-18 10:20:15.000000 1 2017-02-27 10:20 :15.000000 1 1 20 17-02-25 10:20:15.000000

+0

idを定数に変更して質問を少し変更しましたが、論理。私は推測している。これは、単純に行を並べ替えて並べ替えるだけで、一致するcar_idとその日付に基づいて表示される順序を照合するようです。 –

関連する問題