sql-server - 带子运行总计的递归 SQL 查询

标签 sql-server common-table-expression

我有一张类似这样的 table

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 次新安装)

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

我编写此查询时遇到的唯一问题是我不知道如何执行:)。

如果有人能为这个问题想出一个更好的标题,我会更改它,当我不确定该朝哪个方向发展时,很难命名这个标题。

最佳答案

这个递归 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

关于sql-server - 带子运行总计的递归 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26555513/

相关文章:

sql - 一条语句中包含所有名称的查询表

sql-server - T-SQL 层次结构查询

sql-server - WITH 语句是每个查询执行一次还是每行执行一次?

sql - 如何在不使用子查询的情况下仅选择具有最大序列的行?

sql-server - 如何调试插入/更新触发器以查看插入/更新的值

sql-server - 即使单元格为空,如何显示数据库记录

r - 将 R 数据帧插入 SQL (RODBC) - 找不到错误表

mysql - 连接两个具有日期范围的表

sql-server - 在 SQL Server 2012 的存储过程中执行多条语句和 CTE?

sql-server - 自连接中引用的SQL Server CTE速度很慢