【发布时间】:2011-12-01 07:36:27
【问题描述】:
我有下表:
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
所有这一切都是对ColA、ColB 和Date 执行GROUP BY 操作并应用聚合函数quantile 函数。到目前为止一切都很好,但我应该有办法在 SQL Server 中执行此操作,因为这是一个可以在 SQL 中干净地完成的聚合操作,当数据量达到数百万时,我真的想在 SQL 中执行此操作而不是统计软件。
我的问题是我找不到编写分位数函数本身的好方法。我尝试使用 NTILE,但是当特定 GROUP BY 下的行数小于 100 时,使用 NTILE(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
【问题讨论】:
-
这里需要什么公式?您的示例表有 8 个不同的值。最低的 1 个百分位 0 和最高的 100 个百分位,其他 6 个分布均匀还是计算方式不同?
-
是的。我认为这里就是这种情况。据我了解,实际上
R正在做一些插值以获得第 95 个百分位数。我可以给你指出这个:stackoverflow.com/questions/95007/… 吗?因为我确信自己试图解释这一点会引发更多的问题而不是答案。如果有帮助,请从 R 中添加一些输出。
标签: sql sql-server sql-server-2008 r