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

8qgya5xd  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(614)

我有sql表 BaseData (数值单位: value 列(随机):

  1. ------------------------------------------------------
  2. | Date | Value | Day | Moth | Year |
  3. ------------------------------------------------------
  4. | 01-07-2020 | 1 | 1 | 7 | 2020 |
  5. | 02-07-2020 | 2 | 2 | 7 | 2020 |
  6. | 03-07-2020 | 3 | 3 | 7 | 2020 |
  7. | 04-07-2020 | 4 | 4 | 7 | 2020 |
  8. | 05-07-2020 | 5 | 5 | 7 | 2020 |
  9. | 06-07-2020 | 6 | 6 | 7 | 2020 |
  10. | 07-07-2020 | 7 | 7 | 7 | 2020 |
  11. | 08-07-2020 | 8 | 8 | 7 | 2020 |
  12. | 09-07-2020 | 9 | 9 | 7 | 2020 |
  13. | 10-07-2020 | 10 | 10 | 7 | 2020 |
  14. ------------------------------------------------------

我需要的是,从 BaseData 在某种程度上,对于每一行,我将得到 Values 从最近7天开始(不包括当天)。
例如,对于7月8日,我们应该有7月1日和7月7日之间的值之和。
例如,这应该是我对上面给定示例的结果表:

  1. ----------------------------
  2. | Date | ResultSum |
  3. ----------------------------
  4. | 01-07-2020 | 0 | //assuming this is the first record
  5. | 02-07-2020 | 1 | //SUM = 1
  6. | 03-07-2020 | 3 | //SUM = 1 + 2
  7. | 04-07-2020 | 6 | //SUM = 1 + 2 + 3
  8. | 05-07-2020 | 10 | //SUM = 1 + 2 + 3 + 4
  9. | 06-07-2020 | 15 | //SUM = 1 + 2 + 3 + 4 + 5
  10. | 07-07-2020 | 21 | //SUM = 1 + 2 + 3 + 4 + 5 + 6
  11. | 08-07-2020 | 28 | //SUM = 1 + 2 + 3 + 4 + 5 + 6 + 7
  12. | 09-07-2020 | 35 | //SUM = 2 + 3 + 4 + 5 + 6 + 7 + 8
  13. | 10-07-2020 | 42 | //SUM = 3 + 4 + 5 + 6 + 7 + 8 + 9
  14. ----------------------------

到目前为止我得到的是:

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

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

mklgxw1f

mklgxw1f1#

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

  1. select
  2. date,
  3. coalesce(
  4. sum(value) over(order by date rows between 7 preceding and 1 preceding),
  5. 0
  6. ) resultsum
  7. from basedata

在不支持 rows 对于窗口函数,可以使用相关子查询或横向联接:

  1. select
  2. date,
  3. (
  4. select coalesce(sum(b1.value), 0)
  5. from basedata b1
  6. where b1.date between dateadd(day, -7, b.date) and dateadd(day, -1, b.date)
  7. ) resultsum
  8. from basedata b

此查询将利用 date 列-并且它具有处理非连续日期的优点。
两个查询都假定日期存储为数据类型 date (或诸如此类)-如果不是这样,你需要 cast() 首先是他们(或者更好的是。。。修复数据模型!)。

展开查看全部

相关问题