我有一张类似这样的表
create table installs (datetime date,installs int);
insert into installs (date, installs)
values
('10-01-2014', 2),
('10-02-2014', 4),
('10-03-2014', 1),
('10-04-2014', 10)
所以我们的表数据看起来像这样
鉴于此表,我想要一个可以产生安装计数的查询。
所以我要找的结果集是
例如,查看第10/2/2014
天的记录。
在day_out=0
上有4次安装。
在那之后的第二天(days_out=1
),现在总共有5个安装(从10/2安装4个,从10/3安装1个)
在那之后的第二天(days_out=2
),共有15个安装(前2天为5天,4天为10个)
我之前在一个更大的查询中很容易做到这一点只是使用内部选择来获得安装计数(在现场总结它们),但是,这不再是削减它...所以我能想到的唯一解决方案是创建值的表,然后将其与更大的查询连接。
我编写此查询的唯一问题是我不知道该怎么做:)。
如果有人能够为我要改变它的问题想出一个更好的标题,那么在我不确定使用它的方向时很难说明这一点。
答案 0 :(得分:4)
这种递归CTE应该可以解决问题。
WITH cte AS(
SELECT date, 0 AS days_out, installs
FROM installs
UNION ALL
SELECT cte.date, cte.days_out + 1, cte.installs + i.installs
FROM cte
INNER JOIN installs i ON cte.date = DATEADD(DAY, -1 * (cte.days_out + 1), i.date)
)
SELECT *
FROM cte
ORDER BY date, days_out