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

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

解決済

2回答

7355閲覧

BigQuery(Standard SQL)でSPLIT関数を使った後、特定のレコードのみ情報抽出したい

SatoshiMaruyama

総合スコア16

BigQuery

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

SQL

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

0グッド

1クリップ

投稿2018/05/01 02:29

編集2018/05/01 04:44

以下のSQLで「SPLIT」した(ネスト化された)レコードのうち、
3レコード目以降(4レコード目、5レコード目...)が存在するレコードのみ、
抽出したいと思っています。

BigQuery(Standard

1SPLIT(Search_Word, " ") as Search_Word_SPLIT

【補足1】
1つの検索キーワードが『東京都 イタリアン クーポン デート』
である場合『クーポン デート』の部分のみ抽出したいと思います。
*各キーワードは半角スペース(" ")でDBに格納されています。

おそらくですが、作業手順は、

  1. 1レコード目を起点とする
  2. 「LEAD()関数」を使って、3レコード目を確認する
  3. (3レコード目が)nullではない場合、そこを抽出する
  4. 4レコード目以降もあれば、併せて抽出する

上記のフローでSQLを書くかと思います。

申し訳ありませんが、どうぞよろしくお願いします。

取得したい結果イメージ

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

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

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

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

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

sazi

2018/05/01 03:30

どのような結果としたいのか不明瞭なので、データで例示して下さい。
SatoshiMaruyama

2018/05/01 04:45

取得したい結果イメージを添付いたしました。どうぞよろしくお願いします。
guest

回答2

0

ベストアンサー

かなり無理矢理なのですが、参考にしていただける部分があるのではと思います。

SQL

1#standardSQL 2 WITH data1 AS ( 3 SELECT 4 '東京都 イタリアン クーポン デート' AS Search_Word 5 UNION ALL 6 SELECT 7 '東京都 エスニック ワード1 ワード2 ワード3' ), 8 data2 AS ( 9 SELECT 10 Search_Word, 11 SPLIT(Search_Word, ' ') AS Search_Word_SPLIT 12 FROM 13 data1 ), 14 data3 AS ( 15 SELECT 16 Search_Word, 17 Search_Word_SPLIT[SAFE_ORDINAL(3)] AS keyword3, 18 Search_Word_SPLIT[SAFE_ORDINAL(4)] AS keyword4, 19 Search_Word_SPLIT[SAFE_ORDINAL(5)] AS keyword5, 20 Search_Word_SPLIT[SAFE_ORDINAL(6)] AS keyword6, 21 Search_Word_SPLIT[SAFE_ORDINAL(7)] AS keyword7 22 FROM 23 data2), 24 data4 AS ( 25 SELECT 26 Search_Word, 27 CASE i 28 WHEN 3 THEN keyword3 29 WHEN 4 THEN keyword4 30 WHEN 5 THEN keyword5 31 WHEN 6 THEN keyword6 32 WHEN 7 THEN keyword7 33 END AS keyword 34 FROM 35 data3 36 CROSS JOIN 37 UNNEST(GENERATE_ARRAY(3, 38 7)) AS i) 39SELECT 40 * 41FROM 42 data4 43WHERE 44 keyword IS NOT NULL;

投稿2018/05/07 13:54

miyu21

総合スコア111

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

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

SatoshiMaruyama

2018/06/11 00:25

ご返信が大変遅くなりました。申し訳ありません。 上記コード、大変参考になりました。 実際、今回実現したかった内容は、「keyword3」「keyword4」...と別カラムで持ちたかった為、 【data3】を最終処理とした後、全取得しました。ありがとうございました。
guest

0

配列中に指定したキーワードが含まれているかどうかを判定するのに、配列に対する比較演算子が準備されていれば良いのですが、そういった演算子は無いので、unnest()を使用して一旦行に展開してから比較するということになります。
試せていませんが、以下の様になるかと思います。

SQL

1select * from [テーブル] t1 2where exists ( 3 select 1 from [テーブル] 4 where [キー項目]=t1.[キー項目] 5 and exists( 6 select 1 from unnest(split(Search_Word, ' ')) AS Search_Word 7 where Search_Word='クーポン' 8 ) 9 and exists( 10 select 1 from unnest(split(Search_Word, ' ')) AS Search_Word 11 where Search_Word='デート' 12 ) 13 )

参考(標準 SQL での配列の操作ー配列のフィルタ処理

投稿2018/05/01 04:43

sazi

総合スコア25173

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

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

SatoshiMaruyama

2018/06/11 00:34

ご返信が大変遅くなりまして、申し訳ありません。 ご指摘の通り、今回、配列に対する、比較用のテーブルが有りません。 したがって、次フェーズで比較テーブルを作成し、 それを「exists」サブクエリで判定させようと思います。 大変参考になりました。ありがとうございます。 ご返信、遅くなり申し訳ありません。
sazi

2018/06/11 00:55

提示したSQLは比較用のテーブルは不要です。 配列比較の演算子が無いのでそのために展開しているのです。
SatoshiMaruyama

2018/06/20 02:09

補足ありがとうございます。すみません。こちらの説明不足です。比較テーブルが不要な点、承知しております。次フェーズとして、比較テーブルも準備できれば良いという意味です。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問