计算 Sql Server 2014 中的百分位数范围
Calculate range of percentiles in Sql Server 2014
我正在使用 Sql Server 2014,我可以获得所有附加组件、SSAS,以及任何需要的东西。
我有一个 table,为了简单起见,它只包含一个整数列。可以安全地假设它包含 10^5 - 10^6 行。
我想计算第 5、10、15...90、95 个百分位数。
我可以通过调用 percentile_cont(或 _disc)18 次来轻松完成。不幸的是,它需要永远。
事实是,我很确定这些调用一遍又一遍地做同样的事情。
有没有一种方法可以更快地计算 table 的百分位数范围?
我可以在 C# 中轻松做到这一点,方法是将所有行加载到内存中,对它们进行排序,然后只要求 0.05*array.Length 项、0.1*array.Length 项等 - 显然快得惊人。我当然可以通过使用 table 变量或临时 table 来复制它,但我很惊讶没有一些内置的方式。
一种方法是使用ntile()
和聚合:
select nt, min(num), max(num), count(*)
from (select t.*, ntile(20) over (order by num) as nt
from t
) t
group by nt
order by nt;
我还应该补充一点,SQL 服务器应该为 window 函数使用列上的索引。因此,您也许可以通过添加索引来加快您的方法。
我正在使用 Sql Server 2014,我可以获得所有附加组件、SSAS,以及任何需要的东西。
我有一个 table,为了简单起见,它只包含一个整数列。可以安全地假设它包含 10^5 - 10^6 行。
我想计算第 5、10、15...90、95 个百分位数。
我可以通过调用 percentile_cont(或 _disc)18 次来轻松完成。不幸的是,它需要永远。
事实是,我很确定这些调用一遍又一遍地做同样的事情。
有没有一种方法可以更快地计算 table 的百分位数范围?
我可以在 C# 中轻松做到这一点,方法是将所有行加载到内存中,对它们进行排序,然后只要求 0.05*array.Length 项、0.1*array.Length 项等 - 显然快得惊人。我当然可以通过使用 table 变量或临时 table 来复制它,但我很惊讶没有一些内置的方式。
一种方法是使用ntile()
和聚合:
select nt, min(num), max(num), count(*)
from (select t.*, ntile(20) over (order by num) as nt
from t
) t
group by nt
order by nt;
我还应该补充一点,SQL 服务器应该为 window 函数使用列上的索引。因此,您也许可以通过添加索引来加快您的方法。