2017-08-11 1 views
0

BigQueryテーブルの範囲内で、毎日最高のカウントを持つエントリを返すクエリを作成しようとしています。BigQueryで1日当たり最大のカウントを選択してください

私は、次のクエリを書くことができました。これは、すべてのエントリとその日のカウントを1日ごとにソートし、最も高いエントリから最も低いエントリまでの製品を返します。

SELECT 
    STRFTIME_UTC_USEC(UTC_USEC_TO_day((ts-25200000)*1000),"%Y-%m-%d") AS day, 
    products.id as product, 
    count(products.id) as num_entries 
FROM 
    TABLE_DATE_RANGE([table_name_], timestamp('20170801'), timestamp(current_date())) 
GROUP BY day, product 
ORDER BY day, num_entries desc 

2017-08-01 . product A . 10 
2017-08-01 . product B . 8 
2017-08-01 . product C . 4 
2017-08-01 . product D . 2 
2017-08-02 . product X . 18 
2017-08-02 . product Y . 15 
2017-08-02 . product Z . 11 
2017-08-03 . product N . 20 
2017-08-03 . product M . 12 
2017-08-03 . product N . 5 
2017-08-03 . product O . 3 
... 

クエリを変更して、毎日の上位エントリ(最高num_entries)のみを返すことはできますか?

2017-08-01 . product A . 10 
2017-08-02 . product X . 18 
2017-08-03 . product N . 20 
... 

答えて

1

それでもBigQueryのレガシーSQLのためにこれを必要とする何らかの理由で場合は - ちょうどあなたの元を包み込み
の下に使用します少し余分なロジック

#legacySQL 
SELECT 
    day, 
    product, 
    num_entries 
FROM (
    SELECT 
    day, 
    product, 
    num_entries, 
    ROW_NUMBER() OVER(PARTITION BY day ORDER BY num_entries DESC) AS win 
    FROM (
    -- your original query START 
    SELECT 
     STRFTIME_UTC_USEC(UTC_USEC_TO_day((ts-25200000)*1000),"%Y-%m-%d") AS day, 
     products.id as product, 
     COUNT(products.id) as num_entries 
    FROM 
     TABLE_DATE_RANGE([table_name_], TIMESTAMP('20170801'), TIMESTAMP(CURRENT_DATE())) 
    GROUP BY day, product  ) 
    -- your original query END 
) 
WHERE win = 1 

その間でのクエリは、0を考えます予想通りクエリは

#standardSQL 
WITH days AS (
    SELECT 
    PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) AS day, 
    products.id AS product, 
    COUNT(*) AS num_entries 
    FROM `table_name_*` 
    WHERE _TABLE_SUFFIX >= '20170801' 
    GROUP BY day, product 
) 
SELECT top.* FROM (
    SELECT ARRAY_AGG(days ORDER BY num_entries DESC LIMIT 1)[OFFSET(0)] AS top 
    FROM days 
    GROUP BY day 
) 

以下のようなものになるだろうと小文字、あなたの質問からダミーデータと単純化されたクエリを使用して再生を開始することができますで
BigQueryのSQL標準に対する

#standardSQL 
WITH days AS (
    SELECT '2017-08-01' AS day, 'product A' AS product, 10 AS num_entries UNION ALL 
    SELECT '2017-08-01', 'product B', 8 UNION ALL 
    SELECT '2017-08-01', 'product C', 4 UNION ALL 
    SELECT '2017-08-01', 'product D', 2 UNION ALL 
    SELECT '2017-08-02', 'product X', 18 UNION ALL 
    SELECT '2017-08-02', 'product Y', 15 UNION ALL 
    SELECT '2017-08-02', 'product Z', 11 UNION ALL 
    SELECT '2017-08-03', 'product N', 20 UNION ALL 
    SELECT '2017-08-03', 'product M', 12 UNION ALL 
    SELECT '2017-08-03', 'product N', 5 UNION ALL 
    SELECT '2017-08-03', 'product O', 3 
) 
SELECT top.* FROM (
    SELECT ARRAY_AGG(days ORDER BY num_entries DESC LIMIT 1)[OFFSET(0)] AS top 
    FROM days 
    GROUP BY day 
) 

結果は次のとおりです。

Row day   product  num_entries 
1 2017-08-01 product A 10 
2 2017-08-03 product N 20 
3 2017-08-02 product X 18 
+0

すばらしい答えをありがとう!スーパーヘルプと徹底。私は学ぶべきことがたくさんある... – dekaliber

2

この作品が、あなたは、クエリのためstandard SQLを使用する必要があることに注意してください:

#standardSQL 
WITH ProductCounts AS (
    SELECT 
    PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) AS date, 
    products.id AS product, 
    COUNT(*) AS num_entries 
    FROM `your_table_*` 
    WHERE _TABLE_SUFFIX >= '20170801' 
    GROUP BY date, product 
) 
SELECT 
    date, 
    ARRAY_AGG(product ORDER BY num_entries DESC LIMIT 1)[OFFSET(0)] AS top_product 
FROM ProductCounts 
GROUP BY date; 
+0

残念ながら、私の組織では従来のSQLを使用していますが、答えに感謝します!私はあなたが書いたすべてのものがどのように一緒に働くかを理解するために、標準のSQLドキュメントを使って作業しています。 – dekaliber

+2

もちろん、問題ありません。しかし、この特定のクエリに対して標準SQLを使用することは可能ですが、それは正しいでしょうか? Googleの内部のチームでも同じことが起こります。従来のSQLと標準のSQLを混在させて使用します。 –

関連する問題