Sql 滚动值的复最小值
我正在研究一个复杂的统计函数,它需要找到至少10个以前计算过的值。前几行的计算值不仅取决于当前行的平均值,还取决于前几行的计算值。下图显示了所需的查询结果: 我能够得到10天的平均值,但是我很难在没有使用窗口函数的情况下对每个场景应用其他计算,这将是非常低效的。以下是我目前掌握的代码:Sql 滚动值的复最小值,sql,sql-server,window-functions,Sql,Sql Server,Window Functions,我正在研究一个复杂的统计函数,它需要找到至少10个以前计算过的值。前几行的计算值不仅取决于当前行的平均值,还取决于前几行的计算值。下图显示了所需的查询结果: 我能够得到10天的平均值,但是我很难在没有使用窗口函数的情况下对每个场景应用其他计算,这将是非常低效的。以下是我目前掌握的代码: CREATE TABLE #TBL( [id] int IDENTITY(1,1) NOT NULL, [price] numeric(20,10) ) INSERT INTO #TBL ([price
CREATE TABLE #TBL(
[id] int IDENTITY(1,1) NOT NULL,
[price] numeric(20,10)
)
INSERT INTO #TBL ([price])
VALUES (93.02),(90.56),(88.63),(90.3),(91.58),(90.42),(89.5),(89.23),(87.07),(85.88),(86.04),(87.26),(87.67),(84.37),(84.13),(83.3),(82.4),(81.73),(82),(80.69),(82.13)
SELECT
[id], [price],
CASE WHEN [id] >= 10 THEN
avg([price]) OVER(ORDER BY ID ASC ROWS BETWEEN 9 PRECEDING AND CURRENT ROW)
END AS [average (last 10)]
FROM #TBL
任何关于创建高效查询的帮助都将不胜感激
CREATE TABLE #TBL(
[id] int IDENTITY(1,1) NOT NULL primary key clustered, --!!!!
[price] numeric(20,10)
)
INSERT INTO #TBL ([price])
VALUES (93.02),(90.56),(88.63),(90.3),(91.58),(90.42),(89.5),(89.23),(87.07),(85.88),(86.04),(87.26),(87.67),(84.37),(84.13),(83.3),(82.4),(81.73),(82),(80.69),(82.13)
select *
from
(
select *, avg([price]) OVER(ORDER BY ID ASC ROWS BETWEEN 9 PRECEDING AND CURRENT ROW) as avg10
from #TBL
) as a
outer apply
(
select min(r.runningdiff) as mindiff
from
(
select sum(l10.diff) over (order by l10.id) as runningdiff
from
(
select TOP (10) b.id, a.avg10 - b.price as diff
from #Tbl as b
where 1=1
and a.Id >= 10
and b.Id between a.id-9 and a.Id
) as l10
) as r
) as rt