我有一个包含四列的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万行,我正在寻找更好的方法来找到解决方案。万分感谢您的帮助!
答案 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
答案 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