【问题标题】:Is it possible to get the PERCENT_RANK for a single record, but relative to the entire table?是否可以获得单个记录的 PERCENT_RANK,但相对于整个表?
【发布时间】:2019-09-13 19:07:16
【问题描述】:

我想要单个记录的 PERCENT_RANK 值,但与整个表相关。这可能吗?

我见过的例子是这样的:

SELECT Name, Salary
  PERCENT_RANK() OVER (ORDER BY Salary)
  FROM Employees

请注意,它正在计算返回的记录集的百分位数。如果您要退回整张桌子,那就太好了。但是,如果您要返回一个子集,那么当我想要整个表(对于一组行,我 不要返回)。

文档是这样说的:

计算一行在一组行中的相对排名

这不是我想要的。基本上,我想这样做(注意:这是非工作代码):

SELECT Name, Salary
  PERCENT_RANK() OVER (SELECT * FROM Employees ORDER BY Salary)
  FROM Employees

所以,实际上,我想说,“给我这个记录的百分位数与整个表格相比。”

在上述情况下,它是相同的,因为我要检索整个表。但我无法提取一条记录并获得其在整个表格中的百分位排名。

SELECT Name, Salary
  PERCENT_RANK() OVER (ORDER BY Salary)
  FROM Employees
  WHERE id = 1234

那一条记录将始终为 1.000,因为它位于所有返回行的 100% 百分位,这只是一条。

【问题讨论】:

    标签: sql-server tsql statistics percentile


    【解决方案1】:
    SELECT e.Name, e.Salary, r.Employee_Rank
    FROM Employees e
        JOIN (
            SELECT id,
            PERCENT_RANK() OVER (ORDER BY Salary) AS Employee_Rank
            FROM Employees
        ) r ON r.Id = e.Id
    WHERE e.id = 1234
    

    【讨论】:

    • 很好的答案,不过一些解释会有所帮助。
    【解决方案2】:

    是的,您需要使用子查询或 CTE:

    WITH CTE AS
        (SELECT id,
                [Name],
                Salary,
                PERCENT_RANK() OVER (ORDER BY Salary) AS PR
         FROM Employees)
    SELECT [Name],
           Salary,
           PR
    FROM CTE
    WHERE id = 1234;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 2020-08-01
      • 2021-10-25
      • 2013-06-01
      • 1970-01-01
      相关资源
      最近更新 更多