質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

410閲覧

SQLで期間ごとにデータを取得したい

yamap55

総合スコア1376

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2022/06/24 17:28

編集2022/06/24 17:29

期間テーブルとデータテーブルがあるときに、期間テーブルの期間に合わせてデータを取得したいです。
期間ごとにSQLを実行してunionすればできるのですが、実際には期間は多いためSQL1回で取得したいと考えています。
うまくJOINすることで可能だとは考えているのですが。。。

環境はBigQueryになります。

データイメージ

期間テーブル

namestart_dateend_date
kikan12000-01-012000-03-01
kikan22000-02-012000-03-01
kikan32000-01-012000-05-01

データテーブル

idhiduke
12000-01-01
22000-01-02
32000-02-01
42000-04-01

求めたい結果

nameiddate
kikan112000-01-01
kikan122000-01-02
kikan132000-02-01
kikan232000-02-01
kikan312000-01-01
kikan322000-01-02
kikan332000-02-01
kikan342000-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;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KOZ6.0

2022/06/24 18:28 編集

BigQuery の SQL は知らないので、回答はしませんが、 data1.hiduke BETWEEN kikan.start_date AND kikan.end_date の条件で結合し、 kikan.name, data1.id 順に並び替えるだけでは?
guest

回答1

0

自己解決

KOZ6.0さんのコメントにより解決しました。
そのままjoinすればよかったのですね。助かりましたありがとうございます。

解決したSQL

sql

1SELECT 2 name, 3 id, 4 hiduke 5FROM kikan 6INNER JOIN data1 7ON hiduke BETWEEN kikan.start_date AND kikan.end_date 8ORDER BY NAME;

投稿2022/06/25 02:19

yamap55

総合スコア1376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問