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



