过去N周(包括销售为0的一周)的SQL销售总额

过去N周(包括销售为0的一周)的SQL销售总额,sql,amazon-redshift,window-functions,Sql,Amazon Redshift,Window Functions,我想显示每周4周销售额的总和当前一周加上前3周的每个项目 原始数据 预期的结果项a作为示例 我试着用 按项目订单按周划分的销售总额第3行 然而,它跳过了没有销售记录的一周,将所有非零值相加。例如:对于第7周,sum over将第7、4、2、1周的销售额相加,计算结果为40。 有什么方法可以达到预期的效果吗?如果你的桌子是桌子,每周都可以 SELECT sum(B.sales), A.week as curweek As totalsales FROM table A, table B WHERE

我想显示每周4周销售额的总和当前一周加上前3周的每个项目

原始数据

预期的结果项a作为示例

我试着用

按项目订单按周划分的销售总额第3行 然而,它跳过了没有销售记录的一周,将所有非零值相加。例如:对于第7周,sum over将第7、4、2、1周的销售额相加,计算结果为40。
有什么方法可以达到预期的效果吗?

如果你的桌子是桌子,每周都可以

SELECT sum(B.sales), A.week as curweek As totalsales
FROM table A, table B
WHERE curweek - B.week <4 
AND curweek - B.week >=0
GROUP BY curweek
由于问题没有提到RDBMS,我在SQL Server中测试了以下代码。以下解决方案适用于SQL Server

我正在做以下活动:

生成周、项目的所有组合 对于组合,生成前4周的sumsales 删除原始列表中不存在的周 声明@table表项CHAR1,周TINYINT,销售INT 插入@table 值“a”、1、10、“a”、2、10、“a”、4、10、“a”、7、10、“a”、8、10、“a”、10、“b”、1、10、“b”、2、10、“b”、4、10、“b”、7、10、“b”、8、10、“b”、10、10;; 与CTE_项目周 像 选择项目,每周 从…起 值1、2、3、4、5、6、7、8、9、10 阿斯特威克 交叉连接 选择不同的项目 来自@table A. 挑选* 从…起 选择t1。项目,案例 当t2.Week为空时 然后又过了一周 按t1划分。按t2划分项目顺序。每周 还有一周吗 本周结束,销售2.销售结束 按t1划分。按t1划分的项目顺序。前3行之间的周行 和当前行 作为总销售额 从CTE_ItemWeek开始,作为t1 左外联接@表为t1上的t2。项=t2。项 t1.week=t2.week AS t 其中week不为空 结果集


如果您只需要查看现有周数的总和,而不需要填充缺少的周数,则可以在标准SQL中通过使用范围而不是行来实现这一点:

select item, 
       week,
       sum (sales) over (partition by item order by week range between 3 preceding and current row)
from the_table
order by item, week;
如果您需要以行的形式填写缺少的周,那么答案在很大程度上取决于所使用的DBMS。在Postgres中,您可以执行以下操作:

with items as (
  select distinct item
  from data
), all_weeks as (
  select i.item, g.week
  from items i
    cross join generate_series(1,10) as g(week)
)    
select t.item,
       t.week,
       sum (d.sales) over (partition by t.item order by t.week range between 3 preceding and current row)
from all_weeks t
  left join data d on d.item = t.item and d.week = t.week
对于其他DBMS系统,generate_系列调用可以替换为固定的周数:

select i.item, g.week
from items i
  cross join ( values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10) ) as g(week) 

显示您的代码。您使用的是哪种DBMS产品?SQL只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加。谢谢你的评论。我正在使用红移。如果我只需要计算当前周的数字,它将起作用。但是,我需要计算每周的结果。谢谢你的意见。你能解释一下你的方法吗?欢迎来到Stack Overflow!虽然这段代码可以解决这个问题,但如何以及为什么解决这个问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设@一匹没有名字的马,对不起。我应该检查一下。我错过了,直接去找解决办法。我的错。“以后会小心的。”一匹没有名字的马同意了。用RDBMS信息更新了我的答案。
+------+------+-------------+
| Item | week | total_sales |
+------+------+-------------+
| a    |    1 |          10 |
| a    |    2 |          20 |
| a    |    4 |          30 |
| a    |    7 |          20 |
| a    |    8 |          20 |
| a    |   10 |          30 |
| b    |    1 |          10 |
| b    |    2 |          20 |
| b    |    4 |          30 |
| b    |    7 |          20 |
| b    |    8 |          20 |
| b    |   10 |          30 |
+------+------+-------------+
select item, 
       week,
       sum (sales) over (partition by item order by week range between 3 preceding and current row)
from the_table
order by item, week;
with items as (
  select distinct item
  from data
), all_weeks as (
  select i.item, g.week
  from items i
    cross join generate_series(1,10) as g(week)
)    
select t.item,
       t.week,
       sum (d.sales) over (partition by t.item order by t.week range between 3 preceding and current row)
from all_weeks t
  left join data d on d.item = t.item and d.week = t.week
select i.item, g.week
from items i
  cross join ( values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10) ) as g(week)