我正在使用之前行中的值查找更新行。
我有這樣的事情:
| 通過...分組 | 價值1 | 價值2 | 值 2 - 預期結果 |
|---|---|---|---|
| 1 | 0 | 20 | 20 |
| 1 | 3 | X | 23 |
| 1 | 5 | X | 28 |
| 1 | 2 | X | 30 |
| 2 | 0 | 30 | 30 |
| 2 | 5 | X | 35 |
| 2 | 2 | X | 37 |
Value2 = Value2 from row before value 1 但列“分組依據”是重要的。如果之前的 Value2 在另一個組中,則: Value2 = Value2
同一個人可以解釋一下這個更新宣告是怎么做的嗎?我嘗試使用帶有 LAG 功能的 CTE,但我總是陷入無限回圈。
Code for create table:
create table test
(
[GroupBy] int
, [Date] date
, [Value1] int
, [Value2] int
)
插入資料:
INSERT INTO test ([GroupBy], [Date] [Value1], [Value2])
VALUES
(1, '2022-01-01', 0, 20),
(1, '2022-01-02', 3, NULL),
(1, '2022-01-03', 5, NULL),
(1, '2022-01-04', 2, NULL),
(2, '2022-01-01', 0, 30),
(2, '2022-01-02', 5, NULL),
(2, '2022-01-03', 2, NULL)
主鍵:[GroupBy]、[Date]
uj5u.com熱心網友回復:
使用
在評論之后,原始請求可能沒有很好地描述,您需要的不是“前行中的 Value2 值 1”,而是“前所有行中的所有 Value2 值 1 的總和”
在這種情況下,請檢查此解決方案
-- Value1 total of all previous Value2
;With MyCTE as (
SELECT
t.[date], t.GroupBy,t.Value1,Value2 = ISNULL(t.Value2,0)
,TotalPreValue2 = SUM(ISNULL(t.Value2,0))
OVER (PARTITION BY t.GroupBy ORDER BY [date] ROWS BETWEEN UNBOUNDED PRECEDING and CURRENT ROW)
FROM test t
)
SELECT [date], GroupBy, Value1, Value2, TotalPreValue2, [Value1 TotalPreValue2] = Value1 TotalPreValue2
FROM MyCTE
GO
如果您需要其他內容,例如“之前所有前行的所有 Value2 的總和 前行的所有 value1 的總和”,請檢查此
-- total of all previous Value1 total of all previous Value2
;With MyCTE as (
SELECT
t.[date], t.GroupBy,t.Value1,Value2 = ISNULL(t.Value2,0)
,TotalPreValue2 = SUM(ISNULL(t.Value2,0))
OVER (PARTITION BY t.GroupBy ORDER BY [date] ROWS BETWEEN UNBOUNDED PRECEDING and CURRENT ROW)
,TotalPreValue1 = SUM(ISNULL(t.Value1,0))
OVER (PARTITION BY t.GroupBy ORDER BY [date] ROWS BETWEEN UNBOUNDED PRECEDING and CURRENT ROW)
FROM test t
)
SELECT [date], GroupBy, Value1, Value2, TotalPreValue2, TotalPreValue1, [TotalPreValue1 TotalPreValue2] = TotalPreValue1 TotalPreValue2
FROM MyCTE
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/446838.html
