2016-11-30 10 views
1

私は単純なクエリを持っている:私は追加するには、自分のコードを調整したいSQL:合計で条件としてパーティションを使用して

|price_band | device | requests 
0    Android 149007 
0.01   Android 466467 
0.05   Android 520661 
0.1   Android 487273 
0    Desktop 319786 
0.01   Desktop 1485894 
0.05   Desktop 1693395 
0.1   Desktop 1547485 

:ように見えるテーブルを返し

SELECT 
    price_band 
    ,device 
    ,SUM(requests) as requests 
From database.price_band_stats 
WHERE 
    day = '2016-10-31' 
    AND product_id = 6584 
    and device IN ('Desktop', 'Android')  
GROUP BY 
    price_band 
    ,device 

余分な列。新しい列は、指定されたデバイスの価格帯以上のすべての要求を合計します。

:私たちは、Android上の価格帯0.05を取る場合、例えば、私は、テーブルは次のようになり、すべての要求の合計が0.05以上(すなわち0.05および0.1)

の価格帯でAndroidにしたいです

price_band  device  requests request_above_price_band 
0    Android 149007  1623408 
0.01   Android 466467  1474401 
0.05   Android 520661  1007934 
0.1    Android 487273  487273 
0    Desktop 319786  5046560 
0.01   Desktop 1485894  4726774 
0.05   Desktop 1693395  3240880 
0.1    Desktop 1547485  1547485 
+0

私はすべてを理解していない、しかし、1つの提案は、作成することです。 2つの一時テーブル。最初のリクエストは既存のリクエストの結果を保持し、2番目のリクエストは結果を追加する追加のカラムで保持します。 2つの一時テーブルを内部結合することができます。 – Alee

+0

このビット:「価格帯が問題の価格帯よりも大きいか等しい」。特に曲がっています –

+0

こんにちは。私は結果の表がこれを明確にするのに役立つかもしれないと思った。たとえばAndroidで価格帯0.05を使用した場合、価格帯が0.05以上(0.05と0.1)のAndroidへのすべてのリクエストの合計が必要です。 – cpokane

答えて

0

あなたはwindow function SUM with ORDER BY DESC and partitionを使用する必要があります。

WITH T AS 
(SELECT 
    price_band 
    ,device 
    ,SUM(requests) as requests 
From database.price_band_stats 
WHERE 
    day = '2016-10-31' 
    AND product_id = 6584 
    and device IN ('Desktop', 'Android')  
GROUP BY 
    price_band,device 
) 
SELECT 
price_band, 
device, 
requests, 
SUM(requests) OVER (PARTITION BY device ORDER BY price_band DESC) 
    as request_above_price_band 
FROM T 
ORDER BY device,price_band 

SQLFiddle demo

+0

こんにちは。これはほとんど機能します... Tを作成するWITHセクションでは、Group Byにも 'device'が必要です。一度私は完全に作品でこれを入れて!この変更を加えることができますか?それを正解とマークします。ありがとう! – cpokane

+0

@cpokane:はい、そうです。一定。 – valex

関連する問題