计算Sql Server 2014中的百分位数范围

计算Sql Server 2014中的百分位数范围,sql,sql-server,tsql,ssas,Sql,Sql Server,Tsql,Ssas,我使用的是Sql Server 2014,我可以获得所有附加组件、SSA,以及任何需要的内容 为了简单起见,我有一个表,其中包含一个带整数的列。可以安全地假设它包含10^5-10^6行 我想计算第5、10、15……90、95百分位 通过调用percentile_cont或_disc18次,我可以很容易地做到这一点。不幸的是,这需要永远 问题是,我很确定这些电话一次又一次地做着同样的事情 有没有一种方法可以更快地计算表格上的百分比范围 在C语言中,我可以很容易地做到这一点,方法是将所有行加载到内存

我使用的是Sql Server 2014,我可以获得所有附加组件、SSA,以及任何需要的内容

为了简单起见,我有一个表,其中包含一个带整数的列。可以安全地假设它包含10^5-10^6行

我想计算第5、10、15……90、95百分位

通过调用percentile_cont或_disc18次,我可以很容易地做到这一点。不幸的是,这需要永远

问题是,我很确定这些电话一次又一次地做着同样的事情

有没有一种方法可以更快地计算表格上的百分比范围

在C语言中,我可以很容易地做到这一点,方法是将所有行加载到内存中,对它们进行排序,然后只要求0.05*array.Length项,0.1*array.Length项等等,显然速度非常快。当然,我可以通过使用表变量或临时表来复制它,但我很惊讶没有某种内置方式。

一种方法是使用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 Server应该为窗口函数使用列上的索引。因此,只需添加一个索引,您就可以加快方法的速度。

一种方法是使用索引和聚合:

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 Server应该为窗口函数使用列上的索引。因此,只需添加一个索引,您就可以加快速度。

尝试将percentile_cont作为单独的列而不是单独的查询运行。在使用percentiles时,请记住该术语是不明确的。请确保计算方法符合您的业务要求。@GordonLinoff-是的,当然-它是选择percentile_cont作为p05,percentile_cont作为p10,。。。。仍然非常非常慢。请尝试将percentile_cont作为单独的列运行,而不是作为单独的查询运行。处理percentiles时,请记住该术语不明确。请确保计算方法符合您的业务要求。@GordonLinoff-是的,当然-它是选择percentile_cont作为p05,percentile_cont作为p10,。。。。仍然非常非常慢。Msg 1033,级别15,状态1,第5行ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP、OFFSET或FOR XML。好了,现在它可以工作了:select nt、minnum、maxnum、count*from select num,ntile20按表格追加订单。按nt从表格a按nt分组,按nt按nt排序;我只是将它与18%的disc调用进行了比较,它在max列中给出了相同的结果,同时速度也非常快。非常感谢。Msg 1033,第15级,状态1,第5行ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP、OFFSET或FOR XML。好的,现在它可以工作了:select nt、minnum、maxnum、count*from select num、NTIL20 overorder BY table.num as nt from table a group BY nt ORDER BY BY nt nt;我只是将它与18%的disc调用进行了比较,它在max列中给出了相同的结果,同时速度也非常快。非常感谢。