期間テーブルとデータテーブルがあるときに、期間テーブルの期間に合わせてデータを取得したいです。
期間ごとにSQLを実行してunionすればできるのですが、実際には期間は多いためSQL1回で取得したいと考えています。
うまくJOINすることで可能だとは考えているのですが。。。
環境はBigQueryになります。
データイメージ
期間テーブル
name | start_date | end_date |
---|---|---|
kikan1 | 2000-01-01 | 2000-03-01 |
kikan2 | 2000-02-01 | 2000-03-01 |
kikan3 | 2000-01-01 | 2000-05-01 |
データテーブル
id | hiduke |
---|---|
1 | 2000-01-01 |
2 | 2000-01-02 |
3 | 2000-02-01 |
4 | 2000-04-01 |
求めたい結果
name | id | date |
---|---|---|
kikan1 | 1 | 2000-01-01 |
kikan1 | 2 | 2000-01-02 |
kikan1 | 3 | 2000-02-01 |
kikan2 | 3 | 2000-02-01 |
kikan3 | 1 | 2000-01-01 |
kikan3 | 2 | 2000-01-02 |
kikan3 | 3 | 2000-02-01 |
kikan3 | 4 | 2000-04-01 |
環境作成用SQL
sql
1CREATE TABLE kikan ( 2 name VARCHAR(10), 3 start_date TIMESTAMP, 4 end_date TIMESTAMP 5); 6 7INSERT INTO kikan VALUES 8 ('kikan1', '2000-01-01', '2000-03-01'), 9 ('kikan2', '2000-02-01', '2000-03-01'), 10 ('kikan3', '2000-01-01', '2000-05-01') 11; 12 13CREATE TABLE data1 ( 14 id INT, 15 hiduke TIMESTAMP 16); 17 18INSERT INTO data1 VALUES 19 (1, '2000-01-01'), 20 (2, '2000-01-02'), 21 (3, '2000-02-01'), 22 (4, '2000-04-01') 23;
取得したい結果のイメージSQL
sql
1SELECT 'kikan1' AS name, id, hiduke FROM data1 WHERE hiduke between '2000-01-01' AND '2000-03-01' 2UNION ALL 3SELECT 'kikan2' AS name, id, hiduke FROM data1 WHERE hiduke between '2000-02-01' AND '2000-03-01' 4UNION ALL 5SELECT 'kikan3' AS name, id, hiduke FROM data1 WHERE hiduke between '2000-01-01' AND '2000-05-01';
もしくは
sql
1WITH 2kikan1_t AS (SELECT name , start_date, end_date FROM kikan WHERE name = 'kikan1'), 3kikan2_t AS (SELECT name , start_date, end_date FROM kikan WHERE name = 'kikan2'), 4kikan3_t AS (SELECT name , start_date, end_date FROM kikan WHERE name = 'kikan3') 5 6SELECT name, id, hiduke FROM kikan1_t inner join data1 on hiduke between kikan1_t.start_date AND kikan1_t.end_date 7UNION ALL 8SELECT name, id, hiduke FROM kikan2_t inner join data1 on hiduke between kikan2_t.start_date AND kikan2_t.end_date 9UNION ALL 10SELECT name, id, hiduke FROM kikan3_t inner join data1 on hiduke between kikan3_t.start_date AND kikan3_t.end_date;
回答1件
あなたの回答
tips
プレビュー