You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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的实现:

  1. PERCENTRANK.INC:包含0和1两个边界,公式是(排名位次 - 1)/(总样本数 - 1),这和SQL标准的PERCENT_RANK()逻辑完全一致,直接用就行。
  2. 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

火山引擎 最新活动