2016-08-29 4 views
0

先週、特定のエンティティIDに関連付けられたすべての行を取得しようとしています。各行にはタイムスタンプがあります。私は、日時のタイムスタンプから日付を抽出することにより、日によってグループこれらのエンティティをしたいのですが、私がしようとしたとき、私はBigQueryのからBigQueryでタイムスタンプから日付を抽出できない

Error: (L6:28): expression STRFTIME_UTC_USEC([data_timestamp], '%Y-%m-%d') in GROUP BY is invalid

を取得します。 DATE()関数で何か問題があるように見えます。ここで

は、私が実行している完全なクエリです:データを見る

SELECT Count(*) FROM [myproj:mydataset.mytable] 
WHERE 
    bool_property=False 
AND 
    entity_id=5667423172689920 
AND 
    DATEDIFF(CURRENT_DATE(), data_timestamp) <= 7 
GROUP BY DATE(data_timestamp) 

、ここでは「data_timestamp」と呼ばれる品質は、実際には適切なタイムスタンプであるように思われます。私は実際にDATE()関数が失敗する理由を理解していません。

ヘルプやヒントはありますか?ありがとう!

答えて

3

あなたはGROUP BYステートメントで式を使用することはできませんBigQueryのレガシーSQLでクエリ

  1. には二つの問題があり、 いうだけでフィールドを(ところで、これを(BigQuery Standard SQLには制限がありません)
  2. GROUP BYを実行すると、すべてのフィールドを選択するだけでなく、COUNTやSUMなどの集計関数を使用する必要があります(GROUP BYの一部ではないフィールドの場合)

だからあなたのクエリは以下のようなものを見ることができます:それはBigQueryのように思える

SELECT DATE(data_timestamp) AS dt, COUNT(1) AS cnt 
FROM [myproj:mydataset.mytable] 
WHERE bool_property=FALSE 
AND entity_id=5667423172689920 
AND DATEDIFF(CURRENT_DATE(), data_timestamp) <= 7 
GROUP BY dt 
+0

がよく、私が表示されても、グループを含んでいます私は 'GROUP BY'を使って他のクエリをテストしたので、標準のsqlを使用していて、うまく動作していたようです。あなたは集計関数のことについては正しいです。私はフィットするように私の質問を変更しました。私の本当の問題は、GROUP BYではなく、DATE関数であり、これは非論理的にはうまくいかないようです。 – bgenchel

+0

構文に基づいて使用する - あなたは従来のsqlを使用しています。私の答えでクエリを実行しようとしましたか?問題は、日付機能ではなく、実際には、従来のSQLのグループごとのステートメントでそれを使用した –

+0

まあまあ仕事!しかし、私は理由を理解しているか分からない。私はあなたの理論/仮説は、それがGROUP BYにあったので、日付関数がうまくいかないということですか?このクエリの仕組みをもう少し説明してください。 – bgenchel

1

残念なことに、従来のSQLでは、GROUP BY式は使用できません。列名によってのみ使用できます。しかし、標準SQLであなたはそれを行うことができます。

SELECT * FROM myproj.mydataset.mytable 
WHERE 
    bool_property=False AND 
    entity_id=5667423172689920 AND 
    DATE_DIFF(CURRENT_DATE(), EXTRACT(DATE FROM data_timestamp), DAY) <= 7 
GROUP BY EXTRACT(DATE FROM data_timestamp) 
+0

はhttps://cloud.google.com/bigquery/query-reference – bgenchel

関連する問題