如何通过SQL查找每次销售的最近52周的平均值

时间:2016-05-05 05:09:41

标签: sql sql-server

我有一个包含四列的CSV文件:日期,批发商,产品和销售。

我正在寻找每个日期的每个产品和批发商组合的最近52周销售额的平均值。这意味着过去52周内 C 批发商 B 的产品 A 的平均售前价格是多少。

例如,我们知道产品的销售情况' A'在批发商' B'在1月,4月,5月,8月分别是100,200,300,400。假设我们在1月之前没有任何记录。所以以前销售产品的平均值是A'在批发商' B' 4月等于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代码只适用于小型数据库。由于我的数据集有超过2500万行,我正在寻找更好的方法来找到解决方案。万分感谢您的帮助!

2 个答案:

答案 0 :(得分: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?

答案 1 :(得分: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