2016-05-05 5 views
1

私は、日付、卸売業者、製品、および販売の4つの列を持つCSVファイルを持っています。SQLで最後の52週間の売上げの平均を見つける方法

私は、各製品と卸売業者の組み合わせごとに、過去52週間の売上の平均を各日付で求めています。これは、製品Aの卸売業者での平均前回の売上高がBで、のC、最後の52週間で何を意味します。

たとえば、1月、4月、5月、8月の卸売業者Bでの製品「A」の販売数がそれぞれ100,200,300,400であることがわかっています。 Janの前にはレコードがないと仮定してください。したがって、4月の卸売業者Bの前回の製品Aの平均販売価格は100/1、5月は(200 + 100)/ 2、 8月の(300 + 200 + 100)/ 3です。

次の表は、私のデータを示しています

date wholesaler product sales 
12/31/2012 53929 UPE54  4 
12/31/2012 13131 UPE55  1 
2/23/2013 13131 UPE55 1156 
4/24/2013 13131 UPE55  1 
12/1/2013 83389 UPE54  9 
12/17/2013 83389 UPE54  1 
12/18/2013 52237 UPE54  9 
12/19/2013 53929 UME24  1 
12/31/2013 82204 UPE55  9 
12/31/2013 11209 UME24  4 
12/31/2013 52237 UPE54  1 

は今、私は小さなデータベースに対して正しく動作するPythonコードを使用しています。データセットには2,500万行以上の行があるため、解決策を見つけるためのより良い方法を探しています。あなたの助けに100万こんにちは!

+1

なぜあなたは、MySQLとSQLサーバのタグの両方でそれをタグ付けしましたか? – cha

+1

2つのソリューションが必要ですか? 1つはmysql用、もう1つはmicrosofts sql-server用ですか?あるいは、これらのタグが何の理由もなく入ってしまったのでしょうか? – BitTickler

+0

実際には今はSQL Serverを使用しています。おそらく、私はmysqlを削除する方が良いでしょう!あなたの通知人に感謝します! – Ashkan

答えて

1

私は、これはあなたが探しているものだと思います。

WITH cte_prep 
      AS (
       SELECT 
        YEAR(date) * 100 + DATEPART(WEEK, [DATE]) AS week 
       , date 
       , RANK() OVER (PARTITION BY product, wholesaler ORDER BY YEAR(date) * 100 + DATEPART(WEEK, [DATE])) AS product_wholesaler_week_rank 
       , [wholesaler] 
       , [product] 
       , [sales] 
       FROM 
        [meta].[dbo].[sales] 
      ) 
    SELECT 
      CW.wholesaler 
     , CW.product 
     , CW.week 
     , CW.product_wholesaler_week_rank 
     , CW.sales 
     , AVG(BW.sales) AS avg_sales 
     FROM 
      cte_prep AS CW 
     INNER JOIN cte_prep BW 
     ON BW.product = CW.product AND 
      BW.wholesaler = CW.wholesaler AND 
      CW.product_wholesaler_week_rank >= BW.product_wholesaler_week_rank 
      AND BW.product_wholesaler_week_rank >= CW.product_wholesaler_week_rank - 52 
     GROUP BY 
      CW.wholesaler 
     , CW.product 
     , CW.week 
     , CW.sales 
     , CW.product_wholesaler_week_rank 
     ORDER BY 
      CW.wholesaler 
     , CW.product 
     , CW.week desc 

The results look like this

+0

ありがとうございました。それは素晴らしいように見えます。私は今コードを実行しており、おそらく結果を得るのに数時間かかるでしょう。しかし、とにかくあなたは素晴らしいです!ありがとう。 – Ashkan

+0

ようこそ!最初にデータのサブセットを使用してコードを試すことができますか? –

+0

あなたは25 milの行があることに気がつきました。その場合、私はcte_prepを具体化し、卸売業者、製品およびランクに非クラスタ化インデックスを配置します。これで助けが必要ですか? –

1
select sum('sales')/count('sales') 
from table 
Group by year(date) 

何を求めていることは、私が与えた答えより少しより複雑です。 1月1日から12月31日までの長期間のグループ分けをしたい場合は、答えを出しました。長い年月が必要な場合もありますが、7月1日から6月30日までの期間が必要な場合があります。

これを行う方法は、日付範囲でグループ化する方法です。参考になるリンクがいくつかあります。

https://dba.stackexchange.com/questions/59356/grouping-by-date-range-in-a-column

SQL Group by Date Range

In SQL, how can you "group by" in ranges?

+0

あなたのソリューションに感謝します。しかし、日付についてはどうですか?各行(日付)で最後の52週間の売上を計算するにはどうすればよいですか? – Ashkan

+1

日付でグループ化します。答えは、あなたが選んだ解決方法によって決まります。たとえば、時間を指定せずに日付別にグループ化すると、2013年12月31日のエントリはすべて平均4.67になります。だからyear()関数を使ってすべての日付エントリをちょうどその年に圧縮し、それをグループ化します。 – r12

+0

もう一度ありがとうございます。今私にとって意味がある。 – Ashkan

関連する問題