答えて
。トリックは、ウィンドウ関数 "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;
ありがとうございました 残念ながら、正しい結果は得られません。 誤った結果です。 1 1 2017-02-12 10:20:15.000000 1 2017-02-09 10:20:15.000000 – Kobra
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
idを定数に変更して質問を少し変更しましたが、論理。私は推測している。これは、単純に行を並べ替えて並べ替えるだけで、一致するcar_idとその日付に基づいて表示される順序を照合するようです。 –
- 1. 計算各入出庫時間からの合計時間
- 2. JavaScriptキャンバスの入出庫を縮める
- 3. Perlでの同時入力と出力
- 4. C#の同時入力と出力?
- 5. MSBuild:最初の実行時にターゲット入力と出力が失敗する
- 6. ajax呼び出し後に追加の入力を入力する
- 7. C++リアルタイムコンソールアプリケーション、同時入力と出力
- 8. 即時音声入力&出力Android
- 9. ユーザ入力時にforループを出力する
- 10. UWP入出力出力
- 11. 出力の次の行に入力を取得する
- 12. 複数の入力行を同時に入力する
- 13. 印刷時のIOError入出力エラー
- 14. データ挿入時にデータベースレコードを自動的に出力する
- 15. 入力時にさまざまな関数を実行してセルに出力
- 16. パイプライン入力/出力
- 17. 入力/出力エラー
- 18. Railsはユーザー入力とタグを同時に出力します
- 19. ユーザの入力を出力に出力しますか?
- 20. 1行に1語入力して出力する
- 21. ファイル入出力
- 22. 入出力プログラム
- 23. 時間入力などの時間形式のシフト、出力
- 24. IObservable出力は入力前に出力されますか?
- 25. シェルスクリプトのプロンプトに入力を検出して入力します
- 26. フォーム提出時に入力フィールドをクリアする
- 27. 即時のiOSで出力するリアルタイムマイク入力
- 28. ログ出力時にJavaコンソールが入力テキストをプッシュ
- 29. プロローグでの入力出力
- 30. ジオメトリシェーダの入力と出力
2番目の行はid_inが3ではなく4であるべきですか?あなたのサンプルデータには、car_id = 1のレコードが4つありますが、レコードは3つあります。あなたはid = 3の代わりにid = 4でなければならないとどう決めましたか? –
現在、私はデータを消去しています。 'in'は2月18日と25日に、 'out'は27時にのみ表示されます。 – Kobra