Sql 内置的分析函数不应用于前N行的功能
想知道是否有任何内置的分析函数支持不应用于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
;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;