Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 Server:可变窗口函数_Sql_Sql Server_Window Functions - Fatal编程技术网

SQL Server:可变窗口函数

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

使用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 | 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