Можно ли получить PERCENT_RANK для одной записи, но относительно всей таблицы? - PullRequest
1 голос
/ 24 апреля 2019

Я хотел бы получить значение PERCENT_RANK для одной записи, но по отношению ко всей таблице. Возможно ли это?

Примеры, которые я видел, выглядят так:

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

Обратите внимание, что он вычисляет процентиль для возвращенного набора записей . Если вы возвращаете весь стол, это здорово. Но если вы возвращаете подмножество, то вы получите только процентиль для строки в возвращенном наборе записей , когда я хочу его для всей таблицы (для группы строк I не возврат).

Док говорит это:

Вычисляет относительный ранг строки в группе строк

Это не то, что я хочу. По сути, я хочу сделать это (примечание: это нерабочий код):

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% -ном процентиле для всех возвращаемых строк, а это только одна.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019
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
0 голосов
/ 24 апреля 2019

Да, вам нужно использовать подзапрос или 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;
...