SQL Server 2012滚动3天Qty百分位排名:选Rank还是Percent_Rank?
针对滚动百分位排名:选PERCENT_RANK而非单纯的RANK
嘿,这个问题我之前刚好碰到过,咱们一步步理清楚怎么对齐Excel的输出:
核心差异先搞懂
首先得明确RANK()和PERCENT_RANK()的本质区别:
RANK():返回的是位次整数(比如窗口里排第1、第3),完全不是百分比形式,和你要的“百分位排名”不是一回事。PERCENT_RANK():返回0到1之间的相对比例值(比如0.3表示处于前30%的位置),这才是对应Excel里百分位排名的核心逻辑。
对齐Excel的两种百分位函数
Excel里的百分位排名有两个常用版本,你得先确认自己用的是哪一个,再对应SQL的实现:
- PERCENTRANK.INC:包含0和1两个边界,公式是
(排名位次 - 1)/(总样本数 - 1),这和SQL标准的PERCENT_RANK()逻辑完全一致,直接用就行。 - PERCENTRANK.EXC:不包含0和1,公式是
(排名位次 - 1)/(总样本数 + 1),SQL里没有直接对应的函数,需要用RANK()结合窗口内的计数手动计算。
具体SQL实现示例
假设你的数据库支持窗口函数(比如BigQuery、Snowflake、PostgreSQL等),这里给你写好完整的代码,包含两种Excel函数的复现:
-- 先计算出Qty字段 WITH calculated_qty AS ( SELECT Date, Ticker, Price, Value, Value / Price AS Qty FROM t ) SELECT Date, Ticker, Qty, -- 对应Excel的PERCENTRANK.INC(直接用PERCENT_RANK) PERCENT_RANK() OVER ( PARTITION BY Ticker -- 按每个Ticker分组 ORDER BY Date -- 按日期排序 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW -- 3天滚动窗口(当前行+前2行) ) AS qty_percent_rank_inc, -- 对应Excel的PERCENTRANK.EXC(手动计算) (RANK() OVER ( PARTITION BY Ticker ORDER BY Date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW ) - 1) / (COUNT(*) OVER ( PARTITION BY Ticker ORDER BY Date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW ) + 1) AS qty_percent_rank_exc FROM calculated_qty ORDER BY Ticker, Date;
最后总结
- 如果你的Excel输出是用
PERCENTRANK.INC生成的,直接用SQL的PERCENT_RANK()就完美对齐。 - 如果是
PERCENTRANK.EXC,就用上面手动计算的方式。 - 绝对不要用单纯的
RANK(),它给你的是位次,不是百分位比例,完全不符合需求。
内容的提问来源于stack exchange,提问作者Coding_Newbie




