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

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

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

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

SQL

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

解決済

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

yamap55
yamap55

総合スコア1344

BigQuery

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

SQL

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

1回答

0評価

0クリップ

189閲覧

投稿2022/06/24 17:28

編集2022/06/25 11:19

期間テーブルとデータテーブルがあるときに、期間テーブルの期間に合わせてデータを取得したいです。
期間ごとに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

CREATE TABLE kikan ( name VARCHAR(10), start_date TIMESTAMP, end_date TIMESTAMP ); INSERT INTO kikan VALUES ('kikan1', '2000-01-01', '2000-03-01'), ('kikan2', '2000-02-01', '2000-03-01'), ('kikan3', '2000-01-01', '2000-05-01') ; CREATE TABLE data1 ( id INT, hiduke TIMESTAMP ); INSERT INTO data1 VALUES (1, '2000-01-01'), (2, '2000-01-02'), (3, '2000-02-01'), (4, '2000-04-01') ;

取得したい結果のイメージSQL

sql

SELECT 'kikan1' AS name, id, hiduke FROM data1 WHERE hiduke between '2000-01-01' AND '2000-03-01' UNION ALL SELECT 'kikan2' AS name, id, hiduke FROM data1 WHERE hiduke between '2000-02-01' AND '2000-03-01' UNION ALL SELECT 'kikan3' AS name, id, hiduke FROM data1 WHERE hiduke between '2000-01-01' AND '2000-05-01';

もしくは

sql

WITH kikan1_t AS (SELECT name , start_date, end_date FROM kikan WHERE name = 'kikan1'), kikan2_t AS (SELECT name , start_date, end_date FROM kikan WHERE name = 'kikan2'), kikan3_t AS (SELECT name , start_date, end_date FROM kikan WHERE name = 'kikan3') SELECT name, id, hiduke FROM kikan1_t inner join data1 on hiduke between kikan1_t.start_date AND kikan1_t.end_date UNION ALL SELECT name, id, hiduke FROM kikan2_t inner join data1 on hiduke between kikan2_t.start_date AND kikan2_t.end_date UNION ALL SELECT name, id, hiduke FROM kikan3_t inner join data1 on hiduke between kikan3_t.start_date AND kikan3_t.end_date;

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

KOZ6.0

2022/06/24 18:28 編集

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

BigQuery

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

SQL

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