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

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

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

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

SQL

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

Q&A

解決済

2回答

6581閲覧

SQL (BigQuery) で2つのテーブルを合わせたテーブルを作りたい

mashiroyuya

総合スコア24

BigQuery

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

SQL

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

0グッド

0クリップ

投稿2018/03/15 05:44

編集2018/03/15 06:15

SQLをつかって以下のようなテーブルの作成(結合)がしたいです。
BigQueryでWITH句を使って一時テーブルを作成したいです。

現在以下の2つのテーブルがあります。

1 : コンテンツIDの一覧テーブル content_table

コンテンツID
1
2
:

2 : ユーザーのコンテンツの評価 (ユーザーが評価していないコンテンツについてのレコードはないです) rating_table

ユーザーコンテンツID評価
A11
A34
B15
C51

この2つを使って次のような「コンテンツ(縦軸) vs ユーザー(横軸) の 評価テーブル(テーブルの各要素が評価値)」を作りたいです。

|コンテンツID\ユーザー|A|B|C|...|
|:--|:--:|--:|
|1|1|5|0|
|2|0|0|0|
|3|4|0|0|
|:||||

これのテーブルをSQLで作りたいのですが可能でしょうか?

現在 with句を使って 上記2つのテーブルを作り、最終的に「評価テーブル」を出すsqlコードが知りたいです。

sql

1with content_table as ( 2~ 3), 4rating_table as ( 5~ 6) 7これ以降に書く「評価テーブル」を吐き出すsql が知りたいです。

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

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

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

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

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

unz.hori

2018/03/15 05:52

テーブルを作るってCREATE TABLEってことですか?
mashiroyuya

2018/03/15 05:58

create table ではなく、現在 with 句を使って 2つの中間テーブルを作成しており, それ以降に sql を追加して 「評価テーブル」吐き出すsqlが知りたいです.
unz.hori

2018/03/15 06:01

あー、BigQueryでWITH句を使った一時表作成の話ですか...
mashiroyuya

2018/03/15 06:03

そうです。やはり難しいでしょうか? create table であればできるのでしょうか?( 現状私の場合はそれを行うことはできませんが)
unz.hori

2018/03/15 06:11

ユーザ数って可変ですよねぇ。出来るのかな
mashiroyuya

2018/03/15 06:12

ユーザー数が固定です。現在のユーザー数でこのテーブルを取りたいという感じです。
unz.hori

2018/03/15 06:13

私はちょっとBigQueryには詳しくないので...。質問に指摘をするとしたらタグだけでなく、質問文にBigQueryでWITH句を使って一時表を作成したいという事を明記した方がいいと思います。
mashiroyuya

2018/03/15 06:14

ありがとうございます。明記しました。
guest

回答2

0

出したい結果はクロス集計表ですね。
それを行う際の一時テーブル作成のSQLにwithを結びつける意図が分かりません。

クロス集計表ならこちら([SQL]クロス集計と、テンポラリテーブルを使用したクエリの分割)などが参考になるかと思います。
※リンク先はBiqQueryのものではありません。

また、array_agg()を使用して横軸を配列で纏めるのもありかなと思います。
取得結果の配列の操作はこちら(配列の操作

尚、当方BigQueryは使用したことはありません。
こんな記事(BigQueryで150万円溶かした人の顔)見つけたので、SQLの提示がおいそれとはできません。

投稿2018/03/15 07:19

編集2018/03/17 08:01
sazi

総合スコア25138

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

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

unz.hori

2018/03/15 07:25

確かに料金は怖いですね。SQL提示して責任持てませんね。
sazi

2018/03/15 07:29

リンク先には「LIMITやWHERE句には何を書いてもテーブルをフルスキャンしてしまう」って書いてありますからねぇ。
guest

0

ベストアンサー

postgresqlでwithが使えたので無理やりベタな方法で組んでみました。(COALESCEはOracleで言うNVL)

[重要] あくまでpostgresqlで試したコードです。応用してBigQueryで実行した結果については責任は取れませんのであしからず。

SQL

1with t as ( 2 select 3 id, 4 COALESCE((select sum(eval) as a from rating_table as x where x.content_id = id and user_id = 'A'), 0) as a, 5 COALESCE((select sum(eval) as a from rating_table as x where x.content_id = id and user_id = 'B'), 0) as b, 6 COALESCE((select sum(eval) as a from rating_table as x where x.content_id = id and user_id = 'C'), 0) as c 7 from 8 content_table left join rating_table on content_table.id = rating_table.content_id 9 group by id order by id 10) 11select * from t;

投稿2018/03/15 07:32

unz.hori

総合スコア1057

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

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

unz.hori

2018/03/15 07:34

なにぶん、SQLの偉い人ではないんでベタでかつpostgresql用です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問