Выбрать строки исключив максимальное значение row_number в рамках каждого окна
Не могу додуматься, как доработать запрос, чтобы получить только самое большое значение в рамках партиции? И вот что я имею в виду на примерах. Есть такой запрос:
SELECT ss.id,
ss.name,
ss.person_id,
ss.contract_id,
ss.eventSubscriptionTypeId,
ss.value_type_name,
ss.default_limit_value,
ss.limit_value,
ss.row_number
FROM (SELECT est.id,
est.name,
es.person_id,
es.contract_id,
es.id AS eventSubscriptionTypeId,
ROW_NUMBER() OVER (PARTITION BY es.event_subscription_type_id) AS row_number,
est.value_type_name,
est.default_limit_value,
esd.limit_value
FROM ks.event_subscription es
INNER JOIN ks.event_subscription_type est ON
es.event_subscription_type_id = est.id
LEFT JOIN ks.event_subscription_detail esd ON
esd.event_subscription_id = es.id
WHERE NOT est.is_deleted
AND NOT es.is_deleted) AS ss
ORDER BY ss.id, ss.eventSubscriptionTypeId;
Чего я хочу:
Получить все строки исключив максимальные из каждой партиции. На скрине строки, которые хочу исключить, то есть у них максимальный event_subscription_type_id.

Буду очень благодарен за любые наводки, подсказки или куда в какую сторону мне думать, так как уже не могу придумать ничего!
Ответы (1 шт):
Большое спасибо за комментарии! Они по делу и действительно ведут в нужную строну. Просидел часов до 4 утра, но в итоге получилось добиться нужной выборки. Немного иначе сделал правда, но результаты верные. По поводу OrderBy спасиьо, не знал. Теперь буду писать лучше! Правда не до конца есть понимание, как партиция работает вместе с COUNT здесь в рамках каждого окна если мыслить, то как оно работает понимаю процентов на 90 пока.
SELECT ss.id,
ss.name,
ss.person_id,
ss.contract_id,
ss.eventSubscriptionTypeId,
ss.value_type_name,
ss.default_limit_value,
ss.limit_value
FROM (SELECT est.id,
est.name,
es.person_id,
es.contract_id,
es.id AS eventSubscriptionTypeId,
ROW_NUMBER() OVER (PARTITION BY es.person_id, es.contract_id, es.event_subscription_type_id ORDER BY es.id) AS row_number,
COUNT(es.id) OVER (PARTITION BY es.person_id, es.contract_id, es.event_subscription_type_id) AS count,
est.value_type_name,
est.default_limit_value,
esd.limit_value
FROM ks.event_subscription es
INNER JOIN ks.event_subscription_type est ON
es.event_subscription_type_id = est.id
LEFT JOIN ks.event_subscription_detail esd ON
esd.event_subscription_id = es.id) AS ss
WHERE row_number < count;
