PERCENT_RANK 的分布不超过 100

Sae*_*ati 3 sql-server t-sql rank

我正在尝试以 0-100 的比例找出查询的每个给定记录的位置。我这样使用PERCENT_RANK排名功能:

select Term, Frequency, percent_rank() over (order by Frequency desc) * 100
from Words
Run Code Online (Sandbox Code Playgroud)

但是当我查看结果时,我看到的不是从 0 开始到 100 的列,而是从 0 开始到 37.xxxx 的列。

虽然BOL没有明确提到结果分布在 0-100 的范围内,但我对这个词的理解percent让我使用了这个排名函数。

我在这里想念什么?

Mar*_*ith 9

如果您有最低频率的联系,就会发生这种情况

计算百分位等级的公式如下 (rk -1)/(rn -1) 其中 rk 等于值的等级,rn 等于项目的计数

下面显示了一个示例以及一个显示如何计算的计算列PERCENT_RANK

因为最高RANK3降序排列时有 7 行。这 (rk -1)/(rn -1)(3-1)/(7 -1)= 2/6=33.3%

SELECT *, 
        RANK() OVER (order by Frequency  desc) AS  Rank1,
        1e2 * (RANK() OVER (order by Frequency  desc) - 1)/(count(*) over() - 1) AS Calc1,
        100 * PERCENT_RANK() OVER (order by Frequency  desc) AS Percent_Rank1, 

        RANK() OVER (order by Frequency  asc) AS  Rank2,
        1e2 * (RANK() OVER (order by Frequency  ASC) - 1)/(count(*) over() - 1) AS  Calc2,
        100 * PERCENT_RANK() OVER (order by Frequency ) AS  Percent_Rank2
from (VALUES (1),(1),(1),(1),(1),(2),(3))V(Frequency )
Run Code Online (Sandbox Code Playgroud)
+-----------+-------+------------------+------------------+-------+------------------+------------------+
| Frequency | Rank1 |      Calc1       |  Percent_Rank1   | Rank2 |      Calc2       |  Percent_Rank2   |
+-----------+-------+------------------+------------------+-------+------------------+------------------+
|         1 |     3 | 33.3333333333333 | 33.3333333333333 |     1 |                0 |                0 |
|         1 |     3 | 33.3333333333333 | 33.3333333333333 |     1 |                0 |                0 |
|         1 |     3 | 33.3333333333333 | 33.3333333333333 |     1 |                0 |                0 |
|         1 |     3 | 33.3333333333333 | 33.3333333333333 |     1 |                0 |                0 |
|         1 |     3 | 33.3333333333333 | 33.3333333333333 |     1 |                0 |                0 |
|         2 |     2 | 16.6666666666667 | 16.6666666666667 |     6 | 83.3333333333333 | 83.3333333333333 |
|         3 |     1 |                0 |                0 |     7 |              100 |              100 |
+-----------+-------+------------------+------------------+-------+------------------+------------------+
Run Code Online (Sandbox Code Playgroud)

  • @SaeedNeamati - 好吧,此时您正在构建自己的非标准功能,因此您需要从指定它应该如何工作开始。您应该提出一个包含示例数据、所需结果的新问题,并询问如何实现。 (4认同)