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

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

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

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

SQL

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

Q&A

解決済

1回答

1085閲覧

sql:window関数で先月末日(最終)時点の値を取得したい

manataku

総合スコア45

BigQuery

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

SQL

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

0グッド

0クリップ

投稿2021/02/20 06:37

編集2021/02/20 11:31

bigquery を利用しています。
やりたいこと
window関数を利用して先月末日時点の値を取得したいです。
bigquery-public-dataにて試したコードが下記ですが、月単位で降順に並べた時の
最初の値は取得できますが、条件として先月末はどのように設定すれば良いでしょうか。

例ではtaxi_idとtrip_start_timestampを月単位したものをpartitonに指定し、
最初の値を取得することはできたのですが、ここから条件設定で詰まっております。
where句をtrip_start_timestampを基準に先月末を指定することになるではないかと考えますが、
アドバイスをいただますと助かります。。

bigquery standard sql SELECT taxi_id ,trip_start_timestamp ,payment_type ,company ,FIRST_VALUE(payment_type) over (PARTITION BY taxi_id,extract(month from trip_start_timestamp) ORDER BY trip_start_timestamp desc) FROM `bigquery-public-data.chicago_taxi_trips.taxi_trips`

イメージ説明

INSERT INTO taxidata (taxi_id, trip_start_timestamp, payment_type, company) VALUES ('bc3b6178088532bbcb1b98f3aaed977', '2020-03-14 00:45:00 UTC','Credit Card', 'Flash Cab'), ('bc3b6178088532bbcb1b98f3aaed977', '2020-03-14 00:45:00 UTC','Credit Card', 'Flash Cab'), ('bc3b6178088532bbcb1b98f3aaed977', '2020-03-12 23:30:00 UTC','Credit Card', 'Flash Cab'), ('bc3b6178088532bbcb1b98f3aaed977', '2020-03-12 19:45:00 UTC','Cash', 'Flash Cab'), ('bc3b6178088532bbcb1b98f3aaed977', '2020-03-14 00:45:00 UTC','Credit Card', 'Flash Cab'), ('bc3b6178088532bbcb1b98f3aaed977', '2020-02-24 08:15:00 UTC','Cash', 'Flash Cab'), ('bc3b6178088532bbcb1b98f3aaed977', '2020-02-23 08:15:00 UTC','Credit Card', 'Flash Cab'), ('bc3b6178088532bbcb1b98f3aaed977', '2020-02-28 08:15:00 UTC','Cash', 'Flash Cab'), ('bc3b6178088532bbcb1b98f3aaed977', '2020-01-24 08:15:00 UTC','Credit Card', 'Flash Cab');

期待する結果
2020-03-14 00:45:00UTC レコード に対しては2020-02-28 08:15:00UTCの type cash
2020-02-23 08:15:00UTC レコード に対しては2020-01-24 08:15:00UTCの type Credit Card

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

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

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

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

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

Orlofsky

2021/02/20 10:36

質問に現行のSELECT結果、CREATE TABLEや既に存在するデータをINSERTで何件か提示できた方がコメントが付きやすくなるのでは?
manataku

2021/02/20 11:33

コメントありがとうございます。 現行の結果と期待する結果について補足致しました。
neko_the_shadow

2021/02/21 04:41

やりたいことは「すべての行に対して、trip_start_timestampの前月末のデータのpayment_typeの値を付与したい」ということであっていますか? - trip_start_timestamp = 2020-03-14 の場合 ... trip_start_timestamp = 2020-02-24のpayment_typeを付与する - trip_start_timestamp = 2020-03-12 の場合 ... trip_start_timestamp = 2020-02-24のpayment_typeを付与する - trip_start_timestamp = 2020-02-24 の場合 ... trip_start_timestamp = 2020-01-24のpayment_typeを付与する - trip_start_timestamp = 2020-02-23 の場合 ... trip_start_timestamp = 2020-01-24のpayment_typeを付与する
manataku

2021/02/21 06:32

neko_the_shadow さん >「すべての行に対して、trip_start_timestampの前月末のデータのpayment_typeの値を付与したい」 はい、その通りです。
guest

回答1

0

ベストアンサー

当月の行に先月末の値を出力するには、当月の行が含まれない範囲でグループ化した結果を出力することになるので、window関数での直接的な実現は無理な気がします。

window関数を使わなければ、以下のように先月末のみの行を持つ中間テーブルを作り、元のテーブルに結合する方法があると思います。(テーブル名はtaxidataにしています。)

SELECT * FROM taxidata t LEFT JOIN ( SELECT * FROM taxidata WHERE trip_start_timestamp IN ( SELECT MAX(trip_start_timestamp) FROM taxidata GROUP BY extract(month from trip_start_timestamp)) ) u ON extract(month from t.trip_start_timestamp)= extract(month from DATE_ADD(u.trip_start_timestamp, INTERVAL +1 MONTH))

投稿2021/02/21 07:57

etsuhisa

総合スコア416

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問