SQL Server:可变窗口函数
使用SQL Server 2016,我有以下两个选项卡:SQL Server:可变窗口函数,sql,sql-server,window-functions,Sql,Sql Server,Window Functions,使用SQL Server 2016,我有以下两个选项卡: T1 ----------------------- User | Y | M | V ---- ------------------ US1 | 2011 | 1 | 87.5 US1 | 2011 | 2 | 76.4 ... | ... | ..| ... US1 | 2018 | 7 | 4.7 US1 | 2018 | 8 | 7.7 US1 | 2018 | 9 | 16.3 US1 | 2018 | 1
T1
-----------------------
User | Y | M | V
---- ------------------
US1 | 2011 | 1 | 87.5
US1 | 2011 | 2 | 76.4
... | ... | ..| ...
US1 | 2018 | 7 | 4.7
US1 | 2018 | 8 | 7.7
US1 | 2018 | 9 | 16.3
US1 | 2018 | 10| 11.1
US1 | 2018 | 11| 98.8
US1 | 2018 | 12| 65.7
US2 | 2011 | 1 | 44.5
US2 | 2011 | 2 | 34.7
... | ... |...| ...
US2 | 2018 | 6 | 18.7
US2 | 2018 | 7 | 5.1
US2 | 2018 | 8 | 1.0
US2 | 2018 | 9 | 4.4
US2 | 2018 | 10| 22.6
US2 | 2018 | 11| 66.5
US2 | 2018 | 12| 23.7
T2
----------
User | S |
---- -----
US1 | 3 |
US2 | 5 |
我想得到一笔这样的流动资金
SELECT t1.Y
,t1.M
,t1.User
,SUM(t1.V) OVER (PARTITION BY t1.User ORDER BY t1.Y,t1.M ROWS BETWEEN t2.S PRECEDING AND CURRENT ROW)
FROM t1
JOIN t2 ON t1.User = t2.User
所以我过去两个月的预期产出是
US1 | 2018 | 11| 133,9 (98.8+11.1+16.3+7.7)
US1 | 2018 | 12| 191.9 (65.7+98.8+11.1+16.3)
US2 | 2018 | 11| 118.3 (66.5+22.6+4.4+1.0+5.1+18.7)
US2 | 2018 | 12| 123.3 (23.7+66.5+22.6+4.4+1.0+5.1)
但是我不能在窗口函数中使用t2.S作为变量
有没有一种方法可以使用窗口函数来实现这一点?我认为窗口框架规范不允许使用表达式。您可以使用“应用”执行此操作:
虽然不能将表达式用于窗框,但可以将其用于滞后。我认为这种方法可能是性能最好的方法。我认为表达式不允许用于窗口框架规范。您可以使用“应用”执行此操作:
虽然不能将表达式用于窗框,但可以将其用于滞后。我认为这种方法可能是性能最好的方法。不确定这是否是最有效的方法,但以下是我的查询结果:
SELECT
T1.[USER],
T1.Y,
T1.M,
O1.V
FROM
@T1 T1
INNER JOIN @T2 T2
ON T2.[User] = T1.[User]
OUTER APPLY
(
SELECT
SUM(V) AS V
FROM
@T1
WHERE
Y = T1.Y
AND M >= (T1.M - T2.S)
AND M <= T1.M
AND [User] = T1.[User]
) O1
ORDER BY
T1.[User], T1.Y, T1.M
结果:
不确定这是否是最有效的方法,但以下是我的查询结果:
SELECT
T1.[USER],
T1.Y,
T1.M,
O1.V
FROM
@T1 T1
INNER JOIN @T2 T2
ON T2.[User] = T1.[User]
OUTER APPLY
(
SELECT
SUM(V) AS V
FROM
@T1
WHERE
Y = T1.Y
AND M >= (T1.M - T2.S)
AND M <= T1.M
AND [User] = T1.[User]
) O1
ORDER BY
T1.[User], T1.Y, T1.M
结果:
添加预期输出。添加预期输出。应用程序右侧的聚合不能引用左侧的列。@PratikBhavsar。那是个打字错误。无意引用其中的外部值。请在发布之前测试您的查询,它与预期的输出不匹配,并为所有单个用户记录返回相同的总和。应用程序右侧的聚合不能引用左侧的列。@PratikBhavsar。那是个打字错误。无意引用那里的外部值。请在发布之前测试您的查询,它与预期输出不匹配,并为所有单个用户记录返回相同的总和。
SELECT
T1.[USER],
T1.Y,
T1.M,
O1.V
FROM
@T1 T1
INNER JOIN @T2 T2
ON T2.[User] = T1.[User]
OUTER APPLY
(
SELECT
SUM(V) AS V
FROM
@T1
WHERE
Y = T1.Y
AND M >= (T1.M - T2.S)
AND M <= T1.M
AND [User] = T1.[User]
) O1
ORDER BY
T1.[User], T1.Y, T1.M