sql - 根据其他两列的累积和更新列值
问题描述
我有下表
缓冲
| id | from_Time | To_time | v1 | v2 | v3 | time Stamp |
|----- |----------- |--------- |---- |---- |---- |--------------------- |
| 104 | 10 | 11 | 9 | 8 | | 2020-12-02 11:03:01 |
| 103 | 9 | 10 | 10 | 11 | | 2020-12-02 10:03:01 |
| 102 | 8 | 9 | 13 | 13 | | 2020-12-02 09:03:01 |
| 101 | 7 | 8 | 12 | 11 | | 2020-12-02 08:03:01 |
| 100 | 6 | 7 | 10 | 8 | | 2020-12-02 07:03:01 |
| 99 | 5 | 6 | 0 | 0 | | 2020-12-02 06:03:01 |
| 98 | 4 | 5 | 0 | 0 | | 2020-12-02 05:03:01 |
| 97 | 3 | 4 | 0 | 0 | | 2020-12-02 03:03:15 |
| 96 | 2 | 3 | 0 | 0 | | 2020-12-02 04:03:02 |
| 95 | 1 | 2 | 0 | 0 | | 2020-12-02 02:03:01 |
| 94 | 0 | 1 | 0 | 0 | | 2020-12-02 01:03:00 |
| 93 | 23 | 0 | 0 | 0 | 2 | 2020-12-02 00:03:00 |
| 92 | 22 | 23 | 0 | 4 | 2 | 2020-12-01 23:03:01 |
| 91 | 21 | 22 | 14 | 13 | 6 | 2020-12-01 22:03:00 |
| 90 | 20 | 21 | 10 | 8 | 5 | 2020-12-01 21:03:00 |
| 89 | 19 | 20 | 7 | 5 | 3 | 2020-12-01 20:03:01 |
| 88 | | | | | | |
| 87 | | | | | | |
| 86 | | | | | | |
| 85 | 23 | 0 | 0 | 0 | 1 | 2020-12-01 01:03:00 |
我想编写一个更新查询来更新列 v3。V3列计算如下
前一天值介于 23 和 0 之间 + 今天日期的第 V1 列的累计总数 - 今天日期的第 V2 列的累计总数
ID 91 的示例
V1 的累计总数是 31 V2 的累计总数是 26 前一天的值在 23 和 0 之间是 1
所以 ID 91 的 V3 值等于 1+31-26 = 6
我想编写一个带有 where 子句的更新查询,以将 ID 的数据从 104 更新到 100。
我可以使用以下查询获得 V3 的新值
select T1.id,
T1.from_time,
T1.To_time,
T1.v1
,T1.v2
,T1.cumm_v1,
T1.cumm_v2
,T1.cumm_v1-T1.cumm_v2 + (
select v3 from Buffer where CAST([time Stamp] as DATE) = '20201202' and from_time = 23 and To_time = 0)
as V3_New
from (
SELECT
id,
from_time,
To_time,
v1,
v2,
[time Stamp]
,SUM(v1) OVER(ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumm_v1
,SUM(v2) OVER(ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumm_v2
FROM Buffer where CAST([time Stamp] as DATE) = '20201202'
) as T1
我在将其转换为更新查询时遇到问题。
解决方案
update T1
set v3 =
T1.cumm_v1-T1.cumm_v2 + (
select v3 from Buffer where CAST([time Stamp] as DATE) = '20201202' and from_time = 23 and To_time = 0)
--as V3_New
from (
SELECT
id,
from_time,
To_time,
v1,
v2,
[v3], --<-- for the update
[time Stamp]
,SUM(v1) OVER(ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumm_v1
,SUM(v2) OVER(ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumm_v2
FROM Buffer where CAST([time Stamp] as DATE) = '20201202'
) as T1
where id between 100 and 104 --ID from 104 to 100.
推荐阅读
- python - 如何舍入 inf 值
- c++ - 你如何将世界坐标系的自然单位转换为opengl单位?
- reactjs - 如何使用保存到 React 状态的范围 - Microsoft Word javascript API?
- verilog - 不完整的分配和锁存器
- c++ - 它在';'之前显示错误预期的主要表达式 令牌
- android - 怎么实现这个CoordinatorLayout where Button below WebView
- haskell - 无法为 newtype 创建 MonadTrans 的派生实例
- php - PHP格式数字到金钱格式。最后 2 位前的小数
- xml - xmllint的`--noout`是什么意思?
- c# - 我如何获得错误数据类型输入的正确异常?