Используете NTILE с менее чем 100 записями? - PullRequest
1 голос
/ 25 июля 2011

Я использую NTILE(100) для вычисления значения 95-го процентиля в моем столбце. В некоторых случаях, когда количество записей меньше 100, NTILE(100) возвращает NULL при запросе значений в 95-м квартиле, поскольку не хватает значений. Я делаю это в настоящее время следующим образом:

CREATE TABLE #Temp(val int)
GO

INSERT INTO #Temp(val) VALUES(1);
INSERT INTO #Temp(val) VALUES(2);
INSERT INTO #Temp(val) VALUES(3);
INSERT INTO #Temp(val) VALUES(4);
INSERT INTO #Temp(val) VALUES(5);
INSERT INTO #Temp(val) VALUES(6);

SELECT val, Quantile
FROM
(
    SELECT val, NTILE(100) OVER (ORDER BY val) AS Quantile
    FROM
    #Temp
) A
WHERE Quantile=95

GO

DROP TABLE #Temp

Мне было интересно, каков принятый стандарт для обработки случая с менее чем 100 значениями в столбце. Есть предложения?

1 Ответ

0 голосов
/ 06 января 2015

Я искал решение для этого для клиентского проекта, который все еще был на SQL Server 2005. Поскольку NTILE просто делит доступные строки на группы, вы никогда не получите более 6 с 6 строками. Если вы хотите разложить их, чтобы они выглядели как процентили (например: 16, 33, 50, 66, 83, 100) Вы можете сделать следующее. Обратите внимание, что вы не обязательно наберете 95 точно, поэтому вам нужно запросить ближайшее значение:

SELECT TOP 1 val, Quantile
FROM
(
    SELECT val, CAST (ROW_NUMBER() OVER (ORDER BY val) * 100.0 / COUNT(*) OVER() AS INT) AS Quantile
    FROM #Temp
) A
WHERE Quantile >= 95 
ORDER BY Quantile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...