Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 滚动值的复最小值_Sql_Sql Server_Window Functions - Fatal编程技术网

Sql 滚动值的复最小值

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

我正在研究一个复杂的统计函数,它需要找到至少10个以前计算过的值。前几行的计算值不仅取决于当前行的平均值,还取决于前几行的计算值。下图显示了所需的查询结果:

我能够得到10天的平均值,但是我很难在没有使用窗口函数的情况下对每个场景应用其他计算,这将是非常低效的。以下是我目前掌握的代码:

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