如何通过SQL查找最近52周每次的平均销售额
我有一个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 下表显示了我的数据:如何通过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
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,并将未分类的索引放在批发商、产品和排名上。需要帮忙吗?欢迎!很高兴能帮忙。再次非常感谢!