Sql 相当于黑斑羚百分位数的函数

Sql 相当于黑斑羚百分位数的函数,sql,impala,percentile,Sql,Impala,Percentile,在黑斑羚中是否有一个功能等同于蜂巢的“百分位”功能?我基本上是在尝试查找表中一组行的百分位数。 我尝试在配置单元中的查询中使用百分位函数,但执行查询和返回结果需要花费大量时间。您可以使用子查询和算术。例如: select t.*, max(case when seqnum <= p * cnt then XXX end) over () as percentile from (select t.*, row_number() over (order

在黑斑羚中是否有一个功能等同于蜂巢的“百分位”功能?我基本上是在尝试查找表中一组行的百分位数。
我尝试在配置单元中的查询中使用百分位函数,但执行查询和返回结果需要花费大量时间。

您可以使用子查询和算术。例如:

select t.*,
       max(case when seqnum <= p * cnt then XXX end) over () as percentile
from (select t.*,
             row_number() over (order by XXX) as seqnum,
             count(*) over () as cnt
      from t
     ) t
选择t.*,

max(当seqnum我没有足够的声誉发表评论时,我会发布一个答案。Gordon Linoffs的答案提供了一个非常好的解决方案。如果分区中只有一个元素(cnt=1),则百分位数返回NULL。如果希望返回该单个元素的值,Gordon解决方案的一个小扩展可能会有所帮助。(代码段还包含列上的分区)

选择组\列,

max(case when(cnt>1和seqnum谢谢Gordon Linoff。我得到错误“AnalysisException:选择列表表达式不是由聚合输出生成的(GROUP by子句中缺少?):行数()超过(ORDER by day1diff ASC)seqnum”当我试图执行最里面的查询时。@PushpaGadde…这是一条奇怪的错误消息。此查询中没有聚合。
select group_column,
   max(case when (cnt > 1 and seqnum <= p * cnt) or cnt = 1 then XXX end) 
   as percentile 
from (select t.*,
         row_number() over (partition by group_column order by XXX) as seqnum,
         count(*) over (partition by group_column) as cnt
  from t) a
group by group_column