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

如何通过SQL查找最近52周每次的平均销售额,sql,sql-server,Sql,Sql Server,我有一个CSV文件,有四列:日期、批发商、产品和销售 我要寻找过去52周的平均销售为每个产品和批发商组合在每个日期。这意味着过去52周内,批发商B在C时,产品A的平均先前销售额是多少 例如,我们知道批发商“B”在1月、4月、5月和8月的产品“A”的销售额分别为100、200、300和400。假设我们在1月之前没有任何记录,那么批发商“B”在4月之前的产品“A”平均销售额等于100/1,在5月等于(200+100)/2,在8月为(300+200+100)/3 下表显示了我的数据: date

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

我要寻找过去52周的平均销售为每个产品和批发商组合在每个日期。这意味着过去52周内,批发商BC时,产品A的平均先前销售额是多少

例如,我们知道批发商“B”在1月、4月、5月和8月的产品“A”的销售额分别为100、200、300和400。假设我们在1月之前没有任何记录,那么批发商“B”在4月之前的产品“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代码只适用于小型数据库。由于我的数据集有超过2500万行,我正在寻找更好的方法来找到解决方案。非常感谢你的帮助

select sum('sales')/count('sales') 
from table 
Group by year(date)
你所要求的比我给出的答案稍微复杂一些。我给出了一个答案,如果你只想将1月1日至12月31日这一年的时间段进行分组,那么这个答案是有效的。也许你想要一年的时间,但也许你想要从7月1日到6月30日

实现这一点的方法是向loo查询按日期范围分组的方法。这里有一些你可能会觉得有用的链接


我想这就是你要找的

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

为什么同时使用Mysql和sql server标记?您想要两种解决方案?一个用于mysql,一个用于microsofts sql server?或者这些标签是无缘无故地插入的吗?实际上我现在正在使用sql server。也许我最好删除mysql!谢谢你们的通知,伙计们!谢谢你的解决方案。但是日期呢?如何计算每行(日期)最近52周的销售额?按日期分组。答案将取决于您选择的解决方案。例如,如果按日期分组而不按时间分组,则2013年12月31日的所有条目的平均值为4.67。因此,使用year()函数将所有日期项压缩到年份,然后分组。再次感谢。我现在明白了。非常感谢你的帮助。看起来棒极了。我现在正在运行代码,可能需要几个小时才能得到结果。但无论如何,你是伟大的!谢谢,欢迎!你可以先用数据的一个子集来测试代码吗?我刚刚注意到你有2500万行。在这种情况下,我将具体化cte_prep,并将未分类的索引放在批发商、产品和排名上。需要帮忙吗?欢迎!很高兴能帮忙。再次非常感谢!