У меня есть следующая таблица:
CREATE TABLE #TEMP (ColA VARCHAR(MAX), ColB VARCHAR(MAX), Date date, Value int)
INSERT INTO #TEMP VALUES('A','B','7/1/2010','11143274')
INSERT INTO #TEMP VALUES('A','B','7/1/2010','13303527')
INSERT INTO #TEMP VALUES('A','B','7/1/2010','17344238')
INSERT INTO #TEMP VALUES('A','B','7/1/2010','13236525')
INSERT INTO #TEMP VALUES('A','B','7/1/2010','10825232')
INSERT INTO #TEMP VALUES('A','B','7/1/2010','13567253')
INSERT INTO #TEMP VALUES('A','B','7/1/2010','10726342')
INSERT INTO #TEMP VALUES('A','B','7/1/2010','11605647')
INSERT INTO #TEMP VALUES('A','B','7/2/2010','13236525')
INSERT INTO #TEMP VALUES('A','B','7/2/2010','10825232')
INSERT INTO #TEMP VALUES('A','B','7/2/2010','13567253')
INSERT INTO #TEMP VALUES('A','B','7/2/2010','10726342')
INSERT INTO #TEMP VALUES('A','B','7/2/2010','11605647')
INSERT INTO #TEMP VALUES('A','B','7/2/2010','17344238')
INSERT INTO #TEMP VALUES('A','B','7/2/2010','17344238')
INSERT INTO #TEMP VALUES('A','B','7/2/2010','17344238')
SELECT * FROM #TEMP
DROP TABLE #TEMP
В R (статистическое программное обеспечение), чтобы вычислить значение 95-го процентиля последнего столбца, я делаю что-то вроде этого:
ddply(data, c("ColA", "ColB", "Date"), summarize, Value95=quantile(Value, 0.95))
и вывод следующий:
A B 2010-07-01 16022293
A B 2010-07-02 17344238
Все, что это делает, выполняет операцию GROUP BY
над ColA
, ColB
и Date
и применяет функцию агрегирования quantile
. Пока все хорошо, но у меня должен быть способ сделать это в SQL Server, потому что это совокупная операция, которая может быть чисто выполнена в SQL, и когда данные имеют порядок миллионов, я действительно хочу сделать это в SQL, а не в статистическое программное обеспечение.
Моя проблема в том, что я не могу найти хороший способ написать саму функцию квантиля. Я пытался использовать NTILE, но не имеет смысла использовать NTILE(100)
, когда число строк в определенном GROUP BY
меньше 100. Есть ли хороший способ сделать это?
ОБНОВЛЕНИЕ: Еще несколько выводов из R
, если это поможет:
> quantile(c(1,2,3,4,5,5), 0.95)
95%
5
> quantile(c(1,2,3,4,5,5), 0.0)
0%
1
> quantile(c(1,2,3,4,5,5), 1.0)
100%
5
> quantile(c(1,2,3,4,5,5), 0.5) // MEDIAN
50%
3.5