SQL之开窗函数二——在复杂场景中的实际运用

Posted on   樱木007  阅读(337)  评论(0编辑  收藏  举报

1.使用开窗函数求移动平局值

大家看股票的时候,经常会看到K线图,里面经常用到的5日、30日移动平均趋势图,那如何使用窗口函数求移动平均值呢

(1)现有一张表Stock,求5日 移动平均值

原表数据结构如下:

 

 

查询5日平均价格语句:

select stockname
,TradingDate
,price
,avg(price) over(partition by stockname 
order by tradingdate rows between 4 preceding and current row) 
as fievedaysavgprice
from Stock

结果如下:

 语法总结:

sum(...A...) over(partition by ...B... order by ...C... rows between ... D1... and ...D2..) 

avg(...A...) over(partition by ...B... order by ...C... rows between ... D1... and ...D2..) 

A:需要被加工的字段名称

B:分组的字段名称

C:排序的字段名称

D:计算的行数范围

rows between unbounded prceding and current row --包括本行和之前所有的行

rows between current row and unbounded following --包括本行和之后所有的行

rows between 3 preceding and current row --包括本行以内和前三行

rows between 3 preceding and 1 following --从前三行到下一行 (5行)

2.分组排序窗口函数实际运用 ntile (n)over(......)

ntile(n) over(partition by ...A... order by ...B...)

n:切片的片数

A:分组的字段名称 

B:排序的字段名称

ntile(n) :用于将分组数据按照顺序切分成n片,返回当前切片值

如果切片不均匀,默认增加到第一个切片的分布

例子:选出2021年退款金额排名前20%的用户 

原数据表:user_refund

 

查询退款20%的语句:具体分析就是按照用户退款金额总数降序分成5组,取第一组的数据

复制代码
select * 
from 
(
select [user_name] 
,sum(refund_amount) as refund_amount
,ntile(5) over(order by sum(refund_amount) desc) as level
from user_refund 
where year(refund_time)=2021
group by [user_name]
)
as a where a.level=1
复制代码

 

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义

随笔 - 88, 文章 - 0, 评论 - 18, 阅读 - 47077

Copyright © 2025 樱木007
Powered by .NET 9.0 on Kubernetes

点击右上角即可分享
微信分享提示