Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 内置的分析函数不应用于前N行的功能_Sql_Sql Server - Fatal编程技术网

Sql 内置的分析函数不应用于前N行的功能

Sql 内置的分析函数不应用于前N行的功能,sql,sql-server,Sql,Sql Server,想知道是否有任何内置的分析函数支持不应用于SQL查询的前n行 示例代码: ;with cte (num, dollar) as ( select 1, cast(1.45 as decimal(12,2)) union all select num + 1, cast(dollar + 1.00 as decimal(12,2)) from cte where num < 20 ) select cte.num, cte.dollar , a

想知道是否有任何内置的分析函数支持不应用于SQL查询的前n行

示例代码:

;with cte (num, dollar) as
(
    select 1, cast(1.45 as decimal(12,2))
    union all
    select num + 1, cast(dollar + 1.00 as decimal(12,2))
    from cte
    where num < 20
)
select cte.num, cte.dollar
    , avg(cte.dollar) over (order by cte.num ROWS 3 PRECEDING) as ThreeMonthAvg
    , avg(cte.dollar) over (order by cte.num ROWS 6 PRECEDING) as SixMonthAvg
from cte
是否有内置的方法告诉函数跳过应用函数的前“n”行,但不从结果集中过滤该行


检查了Microsoft文档,但我自己找不到任何支持或否认这一点的内容。

没有内置方法,但此版本适用于更多情况:

with cte (num, dollar) as (
      select 1, cast(1.45 as decimal(12,2))
      union all
      select num + 1, cast(dollar + 1.00 as decimal(12,2))
      from cte
      where num < 20
     )
select cte.num, cte.dollar,
       (case when count(*) over (order by cte.num ROWS 3 PRECEDING) = 3
             then avg(cte.dollar) over (order by cte.num ROWS 3 PRECEDING)
        end) as ThreeMonthAvg,
       (case when count(*) over (order by cte.num ROWS 6 PRECEDING) = 6
             then avg(cte.dollar) over (order by cte.num ROWS 6 PRECEDING)
        end) as SixMonthAvg
from cte;
这实际上是对进入平均值的行进行计数,而不是取决于特定的数值

with cte (num, dollar) as (
      select 1, cast(1.45 as decimal(12,2))
      union all
      select num + 1, cast(dollar + 1.00 as decimal(12,2))
      from cte
      where num < 20
     )
select cte.num, cte.dollar,
       (case when count(*) over (order by cte.num ROWS 3 PRECEDING) = 3
             then avg(cte.dollar) over (order by cte.num ROWS 3 PRECEDING)
        end) as ThreeMonthAvg,
       (case when count(*) over (order by cte.num ROWS 6 PRECEDING) = 6
             then avg(cte.dollar) over (order by cte.num ROWS 6 PRECEDING)
        end) as SixMonthAvg
from cte;