2015-01-11 2 views
5

У меня есть таблица с таймингами, где мы храним 1 миллион таймингов ответов для тестирования нагрузки, теперь нам нужно разделить эти данные на 100 групп, то есть - первые 500 записей, как одна группа и так далее, и вычислить процентиль каждой группы, а не средний.Как вычислить процентиль в postgres

до сих пор я попробовал этот запрос

Select quartile 
    , avg(data) 
    , max(data) 
    FROM (

     SELECT data 
      , ntile(500) over (order by data) as quartile 
      FROM data 
     ) x 
GROUP BY quartile 
ORDER BY quartile 

но как я должен найти процентиль

ответ

6

ntile является, как один вычисляет процентилей (среди других русских плиток, такие как квартили, децили, и т.д.).

ntile группирует таблицу в указанное количество ковшей как можно более равномерно. Если вы указали 4 ведра, это будет квартиль. 10 будет децилем.

Для процентиля, вы бы установить количество ведер 100.

Я не уверен, где 500 приходит сюда ... если вы хотите, чтобы определить, какие процентиль ваших данных в (т. е. разделите миллион таймингов как можно более равно 100 копец), вы должны использовать ntile с аргументом 100, а группы будут иметь более 500 записей.

Если вас интересует avg или max, вы можете удалить кучу из вашего запроса. Так это будет выглядеть примерно так:

SELECT data, ntile(100) over (order by data) AS percentile 
FROM data 
ORDER BY data 
+0

каждая группа содержит 500 записей, так как было бы 100 групп .. так что ntile будет автоматически вычислять процентили? для каждой группы? – lampdev

+0

Не знаете, что вы подразумеваете под «каждая группа содержит 500 записей». Какие группы? Все ваши данные находятся в таблице данных. 'ntile (100)' на этих данных будет ведро данных в 100 групп, однако много строк, которые будут. И именно так можно вычислить процентиль для любого заданного набора данных. Если сначала вы разбили на 500 групп, это уже не процентиль ... – khampson

+0

нам нужно построить график процентиля, который идет от asc до desc order .. table содержит 50 000 таймингов, теперь нам нужно разделить эти 50 000 таймингов на групп и вычислять процентили для каждой группы, я немного смущен этим. или как мы можем достичь этого? – lampdev

4

Обычно, если вы хотите знать, процентиль, вы безопаснее с помощью cume_dist чем ntile. Это связано с тем, что ntile ведет себя странно, когда ему дают несколько входов. Рассмотрим:

=# select v, 
      ntile(100) OVER (ORDER BY v), 
      cume_dist() OVER (ORDER BY v) 
    FROM (VALUES (1), (2), (4), (4)) x(v); 

v | ntile | cume_dist 
---+-------+----------- 
1 |  1 |  0.25 
2 |  2 |  0.5 
4 |  3 |   1 
4 |  4 |   1 

Вы можете видеть, что ntile использует только первые 4 из 100 ведер, где cume_dist всегда дает вам число от 0 до 1. Таким образом, если вы хотите узнать 99th процентиль, вы можете просто выбросьте все с cume_dist под 0.99 и возьмите наименьшее v с того, что осталось.

Если вы находитесь на Postgres 9.4+, то percentile_cont and percentile_disc сделать это еще проще, потому что вам не нужно самостоятельно строить ведра. Первая даже дает вам интерполяцию между значениями, что снова может быть полезно, если у вас есть небольшой набор данных.

Смежные вопросы