#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. Потрясающе! Спасибо за быстрый ответ 😉