我喜欢使用row_number()
/rank()
和window函数直接进行这些计算。内置函数很有用,但实际上并没有节省太多精力:
SELECT id,
MIN(CASE WHEN seqnum >= 0.9 * cnt THEN x END) as percentile_90
FROM (select t.*,
row_number() over (partition by id order by x) as seqnum,
count(*) over (partition by id) as cnt
from my_table t
) t
GROUP BY id
ORDER BY id;
这将采用第90个百分点或更高的第一个值。可以做连续版本的版本有多种变体(取最大值小于或等于,最小的值大于并进行插值)。