Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在当前行中,对表示上周(7天)记录的行的数据求和_Sql_Sql Server_Sum_Subquery_Window Functions - Fatal编程技术网

Sql 在当前行中,对表示上周(7天)记录的行的数据求和

Sql 在当前行中,对表示上周(7天)记录的行的数据求和,sql,sql-server,sum,subquery,window-functions,Sql,Sql Server,Sum,Subquery,Window Functions,我有SQL表BaseData(value列中的值是随机的): 我需要的是,从BaseData查询数据的方式是,对于每一行,我将得到过去7天(不包括当天)的值的和 例如,对于7月8日,我们应该有7月1日和7月7日之间的值之和 例如,这应该是上面给定示例的结果表: ---------------------------- | Date | ResultSum | ---------------------------- | 01-07-2020 | 0 | //

我有SQL表
BaseData
value
列中的值是随机的):

我需要的是,从
BaseData
查询数据的方式是,对于每一行,我将得到过去7天(不包括当天)的
值的

例如,对于7月8日,我们应该有7月1日和7月7日之间的值之和

例如,这应该是上面给定示例的结果表:

----------------------------
|    Date    |  ResultSum  | 
----------------------------
| 01-07-2020 |      0      | //assuming this is the first record
| 02-07-2020 |      1      | //SUM = 1
| 03-07-2020 |      3      | //SUM = 1 + 2
| 04-07-2020 |      6      | //SUM = 1 + 2 + 3
| 05-07-2020 |      10     | //SUM = 1 + 2 + 3 + 4
| 06-07-2020 |      15     | //SUM = 1 + 2 + 3 + 4 + 5
| 07-07-2020 |      21     | //SUM = 1 + 2 + 3 + 4 + 5 + 6
| 08-07-2020 |      28     | //SUM = 1 + 2 + 3 + 4 + 5 + 6 + 7
| 09-07-2020 |      35     | //SUM = 2 + 3 + 4 + 5 + 6 + 7 + 8
| 10-07-2020 |      42     | //SUM = 3 + 4 + 5 + 6 + 7 + 8 + 9
----------------------------
到目前为止,我得到的是:

SELECT Date,
       (SELECT SUM(nestedTable.Value)
        FROM BaseData AS nestedTable
        WHERE DATEADD(dd, DATEDIFF(dd, 0, Date), 0) BETWEEN
              DATEADD(day, DATEDIFF(day, 0, DATEADD(d,-1, Date)), 0) AND
              DATEADD(day, DATEDIFF(day, 0, DATEADD(d,-8, Date)), 0)
       ) AS ResultSum
FROM BaseData

但它似乎不起作用。我发现了一些类似的问题,但我不知道如何在这里使用这些答案。

只需使用窗口函数即可。假设表中的日期是连续的,您可以执行以下操作:

select
    date,
    coalesce(
        sum(value) over(order by date rows between 7 preceding and 1 preceding),
        0
    ) resultsum
from basedata
在不支持
子句到窗口函数的SQL Server版本中,可以使用相关子查询或横向联接:

select
    date,
    (
        select coalesce(sum(b1.value), 0)
        from basedata b1
        where b1.date between dateadd(day, -7, b.date) and dateadd(day, -1, b.date)
    ) resultsum
from basedata b
此查询将利用
date
列上的索引,并具有处理非连续日期的优势


这两个查询都假定日期存储为数据类型
date
(或类似的数据类型)-如果不是这样,则需要先
cast()
它们(或者更好的是…修复数据模型!)。

只需使用窗口函数即可。假设表中的日期是连续的,您可以执行以下操作:

select
    date,
    coalesce(
        sum(value) over(order by date rows between 7 preceding and 1 preceding),
        0
    ) resultsum
from basedata
在不支持
子句到窗口函数的SQL Server版本中,可以使用相关子查询或横向联接:

select
    date,
    (
        select coalesce(sum(b1.value), 0)
        from basedata b1
        where b1.date between dateadd(day, -7, b.date) and dateadd(day, -1, b.date)
    ) resultsum
from basedata b
此查询将利用
date
列上的索引,并具有处理非连续日期的优势


这两个查询都假定日期存储为数据类型
date
(或诸如此类)-如果不是这样,您需要先
cast()
它们(或者更好的是…修复您的数据模型!)。

升级到支持的SQL Server版本,这很简单,因为您可以访问
OVER
子句中
之间的
行。考虑到SQL Server 2008已经完全不受支持一年了,您应该已经有了这些升级计划。请用@ZoharPeled表格格式的文本回答您的问题,因为它至少可以轻松使用。这比我们经常看到的图像要好得多。@Larnu我不会把我的标准降低到说“好”的程度。这可以说是半体面的,但你是对的,我也觉得问题质量最近正在下降(顺便说一句,投票按钮的简单操作也是如此。我最好的投票答案是一个非常新的答案,只不过是一个文档引用-我写了更好的答案,不幸得0分…)@delux有一个漂亮的小按钮,叫做“文本到DDL”。尝试一下。升级到受支持的SQL Server版本,这很简单,因为您可以访问
OVER
子句中
之间的
行。考虑到SQL Server 2008已经完全不受支持一年了,您应该已经有了这些升级计划。请用@ZoharPeled表格格式的文本回答您的问题,因为它至少可以轻松使用。这比我们经常看到的图像要好得多。@Larnu我不会把我的标准降低到说“好”的程度。这可以说是半体面的,但你是对的,我也觉得问题质量最近正在下降(顺便说一句,投票按钮的简单操作也是如此。我最好的投票答案是一个非常新的答案,只不过是一个文档引用-我写了更好的答案,不幸得0分…)@delux有一个漂亮的小按钮,叫做“文本到DDL”。试一试。不幸的是,OP已经标记了SQLServer2008<代码>行之间的
仅在支持的SQL Server版本中可用,因为它是在SQL Server 2012中引入的。这是假设表中的日期是连续的…@Larnu:啊,是的,一开始没有发现这一点。请用相关子查询来回答更新。@ZoharPeled:事实上,-OP的示例数据并没有以其他方式显示。是的,@GMB,但您(讽刺地)在三角联接中处理了这个逻辑。:)不幸的是,OP已经标记了SQL server 2008<代码>行之间的
仅在支持的SQL Server版本中可用,因为它是在SQL Server 2012中引入的。这是假设表中的日期是连续的…@Larnu:啊,是的,一开始没有发现这一点。请用相关子查询来回答更新。@ZoharPeled:事实上,-OP的示例数据并没有以其他方式显示。是的,@GMB,但您(讽刺地)在三角联接中处理了这个逻辑。:)