在sql server中将整数参数传递到order by子句中

whhtz7ly  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(408)

我正在尝试在sql server中创建一个存储过程,该过程计算如下移动平均值:

CREATE PROCEDURE calcMA (@value_name AS varchar(100),
                         @period AS INT,
                         @col1 AS varchar(100),
                         @col2 AS varchar(100))

    WITH CTE_MA (DT, RowNumber, MA) AS 
    (
        SELECT 
            DT,
            ROW_NUMBER() OVER (ORDER BY DT ASC) RowNumber,
            AVG(LSTPX) OVER (ORDER BY DT ASC ROWS 9 PRECEDING) AS MA
        FROM 
            dbo.myDb
        WHERE 
            Col1 = @Col1 AND Col2 = @Col2
    )
    SELECT 
        @value_name AS Name, DT,
        IIF (RowNumber > @period - 1, MA, NULL) AS 'Value' 
    FROM 
        CTE_MA

我遇到的问题是我想要 @period 用于替换中数字9的参数 ORDER BY 然而,我发现这很难做到。
如果我尝试 ORDER BY DT ASC ROWS @period -1 PRECEDING 或者 ORDER BY DT ASC ROWS (@period - 1) PRECEDING ,我得到语法错误。
我读到的关于这个的问题有一个文本变量,在 ORDER BY 条款,该条款要求 CASE 表达式,但我还没有看到关于如何输入连续数的答案。
谢谢你的帮助。

vjhs03f7

vjhs03f71#

我想你可以用它做你想做的事 apply :

with d as (
      select d.*, row_number() over (order by dt) as seqnum
      from db.mydb
      where Col1 = @Col1 and Col2 = @Col2
     )
select d.*, dd.avg_lstpx
from d cross apply
     (select avg(d2.LSTPX) as avg_lstpx
      from d d2
      where d2.col1 = d.col1 and d2.col2 = d.col2 and
            d2.seqnum >= d.seqnum - @period
            d2.seqnum <= d.seqnum
     ) dd

相关问题