子运行总计的递归SQL查询

时间:2014-10-24 20:11:29

标签: sql-server common-table-expression

我有一张类似这样的表

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)

所以我们的表数据看起来像这样

Table Data

鉴于此表,我想要一个可以产生安装计数的查询。

所以我要找的结果集是

Result Set

例如,查看第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个)

我之前在一个更大的查询中很容易做到这一点只是使用内部选择来获得安装计数(在现场总结它们),但是,这不再是削减它...所以我能想到的唯一解决方案是创建值的表,然后将其与更大的查询连接。

我编写此查询的唯一问题是我不知道该怎么做:)。

如果有人能够为我要改变它的问题想出一个更好的标题,那么在我不确定使用它的方向时很难说明这一点。

1 个答案:

答案 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