次の構造のテーブルがあります。
date city cntry free occ
2018-08-13 16:30:00 2 12 5
2018-08-13 16:30:00 2 12 0
2018-08-13 14:30:00 2 12 1
2018-08-13 11:00:00 2 12 2
2018-08-12 13:00:00 2 12 1
2018-08-12 13:00:00 2 12 4
2018-08-12 08:00:00 2 12 3
2018-08-12 08:00:00 2 12 2
2018-08-10 15:30:00 2 12 4
timestamp without timezone
ですnumbers
空きと占有の両方について、特定のcity_id/country_id
コンボの以前のnull以外の値を取得したい:
date city cntry free occ
2018-08-13 16:30:00 2 12 0 5
2018-08-13 14:30:00 2 12 1 4
2018-08-13 11:00:00 2 12 2 4
2018-08-12 13:00:00 2 12 1 4
2018-08-12 08:00:00 2 12 2 3
2018-08-10 15:30:00 2 12 1 4
city_id, country_id
順、date
順基本的に、2つのタイムラインをマージしていて、<city_id, country_id>
の各パーティションの以前の値(空き/占有)を保持したいと考えています。
無駄にウィンドウ関数で遊んでみました。自由値または占有値のいずれかでデータを取得できますが、両方は取得できません。
どうすればこれを達成できますか?
MAX
関数をcoalesce
と組み合わせて使用してみてください。
スキーマ(PostgreSQL v9.6)
CREATE TABLE T(
date date,
city_id int,
country_id int,
free int,
occupied int
);
insert into T values ('2017-01-01',2,3,null, 2);
insert into T values ('2017-01-02',2,3,4, null);
insert into T values ('2017-01-02',2,3,null, 5);
insert into T values ('2017-01-04',3,4,2, null);
クエリ#1
SELECT
date,
city_id,
country_id,
coalesce(MAX(free),0) free ,
coalesce(MAX(occupied),0) occupied
FROM T
GROUP BY date,city_id,country_id
order by date;
| date | city_id | country_id | free | occupied |
| ------------------------ | ------- | ---------- | ---- | -------- |
| 2017-01-01T00:00:00.000Z | 2 | 3 | 0 | 2 |
| 2017-01-02T00:00:00.000Z | 2 | 3 | 4 | 5 |
| 2017-01-04T00:00:00.000Z | 3 | 4 | 2 | 0 |