2016-09-26 9 views
0

Amazon Redshiftを使用してデータを照会しています。私は、各四半期グループ内で最も収益を上げたトップ4の製品を選択したいと考えています。私は窓関数を使って四半期内の製品ごとの収益の合計値を計算し、別のウィンドウ関数を使用して各グループの上位4項目を選択しました。私のコードは次のとおりです。窓関数は節by by節でサポートされていません

SELECT es.itemid,es.total_Revenue,es.quarter 
FROM (   
     SELECT SALE_CET.itemid 
     --get total revenue per quarter 
      ,SUM(SALE_CET.totalseller) OVER 
        (PARTITION BY SALE_CET.itemid,SALE_CET.quarter) AS total_Revenue 
      ,SALE_CET.quarter 
     --Rank the data by total revenue within each group 
      ,ROW_NUMBER() OVER 
        (PARTITION BY SALE_CET.quarter ORDER BY total_Revenue DESC 
        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS ra 
     FROM SALE_CET) es 
WHERE es.ra <=4 

私はorder-by句で集計値を使用できないことがあります。しかし、レコードを四半期ごとのアイテムごとの総収入で注文したい場合は、どのように実装できますか?

ありがとうございました。

SALE_CETテーブルは、CTEから作成された一時テーブルです。 CREATE TABLEコマンドは次のようになります:

WITH SALE_CET (userid,itemid, totalseller,year,month,quarter,dayofyear) AS 
    (SELECT userid 
      ,itemid 
      ,itemprice*orderqty AS TotalSeller 
      ,DATEPART (year, orderdatetime) AS year 
      ,DATEPART (month, orderdatetime) AS month 
      ,DATEPART (quarter, orderdatetime) AS quarter 
      ,DATEPART (dayofyear, orderdatetime) AS dayofyear   
     FROM sales) 
+1

'SALE_CET'を作成するために使用した' create table'を提供してください。 – redneb

+0

それは何であれ、特定のエラーが発生していますか?クエリの最後にORDER BY es.total_Revenueを追加するだけで済みます。それは派生テーブルの外側の選択ですので、なぜ動作しないのか分かりません。 – Matt

+0

@Matt、こんにちはマット、あなたの提案に感謝します。外部クエリで "ORDER BY quarter、total_Revenue DESC"を使用すると、期待される順序ですべてのアイテムを表示できます。しかし、各カテゴリ(ここでは四半期)の上位4項目を選択するには、 –

答えて

0

、あなたはの順にその値をアクセスできるようにする必要があり、あなたのサブクエリで収益の降順でランク付けし、別のROW_NUMBER()またはDENSE_RANK()を追加した場合外側のクエリ

次のようなものです。これは一般的な考えです。

SELECT 
     * 
    FROM 
    (
     SELECT 
      itemid, 
      total_Revenue, 
      quarter 
      ra, 
      RevenueByItemThenByQuarter=DENSE_RANK() OVER 
       (PARTITION BY SALE_CTE2,ietemid,SALE_CET2.quarter ORDER BY SALE_CTE2.total_Revenue DESC 
     FROM 
     (
      SELECT SALE_CET.itemid 
        --get total revenue per quarter 
         ,SUM(SALE_CET.totalseller) OVER 
           (PARTITION BY SALE_CET.itemid,SALE_CET.quarter) AS total_Revenue 
         ,SALE_CET.quarter 
        --Rank the data by total revenue within each group 
         ,ROW_NUMBER() OVER 
           (PARTITION BY SALE_CET.quarter ORDER BY total_Revenue DESC 
           ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS ra 
        FROM SALE_CET 
     )AS SALE_CET2 
    )AS es 
    WHERE 
     es.ra <=4 
    ORDER BY 
     es.RevenueByItemThenByQuarter 
+0

別のROW_NUMBER()を既存のものと並列に追加することを意味しますか?それがどのように動作するのか理解していない。サンプルクエリコードを提供できますか? –

+0

ありがとうございます。コードは従来のデータベースでうまく動作すると思いますが、Redshiftでは同じエラーが発生します。私は、コード "行間の未定義と未定義の間に行"を追加するかどうか、次のようにエラーを返します: "フレーム句はランクウィンドウ関数に指定してはいけません"/"ウィンドウ関数はorder by句でサポートされていません" –

+0

Doh!私はあなたのra分野が収入に基づいているのを見ただけです。私の答えは、あなたの質問には、申し訳ありません適用されません。 –

関連する問題