【发布时间】:2020-01-14 23:04:46
【问题描述】:
我正在测试这段代码。
SELECT ID, Cluster, Date, Price,
AVG(Price) OVER (PARTITION BY Cluster ORDER BY Date ROWS BETWEEN 171 PRECEDING AND CURRENT ROW) As ClusterAverage
FROM tblCluster
WHERE LEN(ID) = 9 AND IDNOT LIKE '%[^a-Z0-9]%'
AND Cluster in ('430.00')
我想我会得到一个 ClusterAverage 的平均价格。我认为这就是'PARTITION BY Cluster' 所做的。相反,我明白了。
ID Cluster Date Price ClusterAverage
50064FAL8 430 6/14/2019 115.5827 115.5827
50064FAL8 430 6/17/2019 115.694 115.63835
50064FAL8 430 6/19/2019 116.5761 115.9509333
50064FAL8 430 6/21/2019 116.1692 116.0055
50064FAL8 430 6/25/2019 117.2248 116.24936
50064FAL8 430 6/27/2019 117.0839 116.38845
50064FAL8 430 6/28/2019 117.0156 116.4780429
50064FAL8 430 6/30/2019 118.2286 116.6968625
在这种情况下,我只有一个 ID 和一个集群,但在大多数情况下,我会在一个集群中拥有多个 ID 号。最后,我要返回 171 天,因为每个 ID 最多可以有 171 天的数据,但它可以少得多,比如每个 ID 不到 10 天的数据。我想知道是否将其编码为 171 是这样做的方法,还是每个 ID 的某种 count-max-days。
【问题讨论】:
-
你想要的实际结果集是什么?听起来您几乎只需要一个简单的非窗口 AVG() 聚合。
标签: sql sql-server tsql window-functions