2017-02-22 14 views
1

私はトップ3のプロバイダを収益で取得しようとしています。これらのプロバイダごとに、そのプロバイダの上位2タイトルをアルファベット順に取得しようとしています。 |BigQueryのグループ制限を制限する

enter image description here

とテーブル構造はprovider次のとおりです。ここで

SELECT 
    provider, 
    title, 
    SUM(customer_price) 
FROM 
    [integrated-myth-156821:fintest.m10] 
GROUP BY 
    title, 
    provider 
LIMIT 
    25 

私が得る結果セットされる - ここで私がして起動する必要があり、基本的なGROUP BYクエリがあります| customer_price。ここで

は、私が取得するために探していた結果の説明図である。

provider  title    sum(revenue) 
Sony        10000 // Top provider by revenue, limit 3 
Sony   Avatar    400 // First title alphabetically, limit 2 
Sony   Titanic   300 
Fox        8000 
Fox    Fresh    12 
Fox    Mike    800 
WB         4500 
WB    Harry    1000 
WB    Potter    1200 

答えて

1

に以下
#legacySQL 
SELECT 
    provider, title, revenue 
FROM 
-- Top 2 (alphabetically) Titles for each of Top 3 Providers 
( 
SELECT 
    titles.provider AS provider, 
    titles.title AS title, 
    titles.revenue AS revenue, 
    top_providers.revenue AS pos 
FROM (
    SELECT provider, title, revenue, ROW_NUMBER() OVER(PARTITION BY provider ORDER BY title) AS pos 
    FROM (
    SELECT provider, title, SUM(customer_price) AS revenue 
    FROM [integrated-myth-156821:fintest.m10] 
    GROUP BY provider, title 
) 
) AS titles 
JOIN (
    SELECT 
    provider, 
    SUM(customer_price) AS revenue 
    FROM [integrated-myth-156821:fintest.m10] 
    GROUP BY provider 
    ORDER BY revenue DESC 
    LIMIT 3 -- sets top 3 providers 
) top_providers 
ON top_providers.provider = titles.provider 
WHERE pos < 3 -- set top two titles 
), 
-- Top 3 Providers by Revenue 
( 
    SELECT 
    provider, 
    '' AS title, 
    SUM(customer_price) AS revenue, 
    SUM(customer_price) AS pos 
    FROM [integrated-myth-156821:fintest.m10] 
    GROUP BY provider 
    ORDER BY revenue DESC 
    LIMIT 3 -- sets top 3 providers 
) 
ORDER BY pos DESC, provider, title 

を試してみてください、あなたは、クエリのいくつかを説明してくださいだろうか?

このクエリは、2つのクエリ
セカンド(クエリの一番下に)の労働組合は、収益プロバイダによって

をトップ3を提供し、実際にある最初のものは、トップ3に各プロバイダのためのトップの2タイトルを提供 - それ自体では

ROW_NUMBER() OVER(PARTITION BY provider ORDER BY title) AS pos  

は、その後だけでフィルタリングすることができます下式でタイトル収入でトップ3のプロバイダの

POSに参加しています解決策以下

WHERE pos < 3 
+0

感謝です - あなたは、クエリのいくつかを説明してくださいだろうか?たとえば、 'OVER(PARTITION')、' JOIN'、および 'LIMIT'副選択のようなものですか?そして、うわー、このクエリは完全に動作します! – David542

+0

@ David542 - 確かに、私の答えの更新を参照してください –

1

との2つのトップのタイトルBigQueryの標準SQLでこれについて

#standardSQL 
WITH topProviders AS (
    SELECT provider, SUM(customer_price) AS revenue 
    FROM `integrated-myth-156821.fintest.m10` 
    GROUP BY provider 
    ORDER BY revenue DESC 
    LIMIT 3 
), 
titles AS (
    SELECT provider, title, SUM(customer_price) AS revenue 
    FROM `integrated-myth-156821.fintest.m10` 
    GROUP BY provider, title 
) 
SELECT provider, title, revenue 
FROM (
    SELECT p.revenue AS sort, 
    STRUCT(p.provider, '' AS title, p.revenue) AS providers, 
    ARRAY_AGG(STRUCT(t.provider, title, t.revenue) ORDER BY title LIMIT 2) AS titles 
    FROM topProviders AS p 
    JOIN titles AS t 
    ON p.provider = t.provider 
    GROUP BY p.provider, p.revenue 
), UNNEST(ARRAY_CONCAT([providers], titles)) 
ORDER BY sort DESC, provider, title 
+0

両方のクエリが同じ量の時間を取って、100M行のデータセットで同じ量のデータを処理しました - 'クエリ完了(2.8秒経過、4.55GB処理)' – David542

+0

はい。同じ金額の処理が期待されます。私はそれが使用するSQLとそれぞれの機能を選択するのが優先事項の問題だと思う。 btw、コードを修正してくれてありがとう:o) –