Как сгруппировать значения в центили и рассчитать сумму и среднее значение других столбцов в sql?

#sql #oracle

Вопрос:

У меня есть таблица SQL в Oracle. Я хочу сгенерировать в 1 запросе: центиль (для нужд примера покажите квартиль и сгруппируйте по вероятности, но мой набор данных не отсортирован по вероятности), сумму баллов в каждом центиле/квартиле и среднюю вероятность. Моя таблица выглядит так (с той разницей, что желаемый результат должен быть сгруппирован в центилях, а не в квартилях):

  
#    ID      Score   Probability
#    1         1        0.9                   
#    2         1        0.8                   
#    3         0        0.6                   
#    4         1        0.6                  
#    5         0        0.5                  
#    6         0        0.4 
#    7         0        0.3                   
#    8         1        0.2 
 

Мой желаемый результат должен выглядеть так:

 
#    quartile  Sum_observations   Sum_score   Avg_probability
#    1         2                  2           0.85          
#    2         2                  1           0.6           
#    3         2                  0           0.45         
#    4         2                  1           0.25           

 

Кто-нибудь может помочь?

Комментарии:

1. n-плитки по какому заказу? По удостоверению личности? Какой в этом смысл? В большинстве сред порядок идентификаторов не имеет никакого значения. Кроме того, вы говорите «сгруппированы по вероятности» — что это вообще значит? (Вы имели в виду упорядоченный по вероятности? Но тогда квартили, упорядоченные по вероятности, также не имеют смысла.)

2. У меня есть вероятности для каждого идентификатора из логистической регрессии и реальных наблюдений в баллах. Я хотел сгруппировать все примеры в центили вероятности и получить сумму истинных значений в каждом из них. @Гордон Линофф решил мою проблему очень быстро, и результат оказался таким, какого я ожидал.

Ответ №1:

Одним из методов является ntile() :

 select centile, count(*) as num_observations,
       sum(score) as sum_score,
       avg(probability)
from (select ntile(100) over (order by probability) as centile,
             t.*
      from t
     ) t
group by centile
order by centile;
 

Комментарии:

1. Потрясающе! Спасибо за быстрый ответ 😉