функций. Для этого можно использовать подзапрос с GROUP BY. Но всё-таки руки чесались, чтобы найти рабочий вариант что было что-то вроде
sum( DISTINCT <column> ) OVER ( ... )
#idea
И мне кажется удалось.
Для начала я пометил строки как _distinct, где значения уникальны в группе пиров, а потом просто:
sum( order_suma ) filter ( where _distinct )
Решение тут: https://stackoverflow.com/a/67142545/4632019
Скажите пожалуйста. На сколько это решение рабочее и может ли оно претендовать как вариант на реализацию
sum( DISTINCT <column> ) OVER ( ... )
?
ЗЫ. Кастати, а где можно почитать почему DISTINCT ещё не реализован для window функций? какие проблемы остались не решенными?
Да в общем так, да, только я бы вместо попыток сравнения array_agg (который большой) сделал rank() OVER agr AS agr_rnk, row_number() OVER agr AS agr_rwn ... WINDOW agr AS (PARTITION BY agreement_id ORDER BY suma), это можно ужэ в первом SELECT, и в следующем sum(suma) FILTER BY (agr_rnk=agr_rwn) OVER ...
А, ещё array_agg(id) кажэтся имеет право быть нестабильной без order_by. Хотя, большынство имплементацый и не будут ломать порядок, конечно. В общем, лучшэ добавить ORDER BY там.
понятно. Значит всё-таки оставить подзапросом и не морочить себе я... голову )
Странный вывод, но ничего не имею против, конечно.
Но Ваша идея мне нравится тоже
Сейчас буду пробовать ваше предолжение по поводу RANK
Лучшэ, для начала, проверь что sq.agreement_id=usage.agreement_id работает такжэ. Не в смысле результата (этот можэт случайно совпасть), а в смысле индекса.
Кстати, с rownumber всё получилось прекрасно [dbfiddle](https://dbfiddle.uk/?rdbms=postgres_13&fiddle=01c699f3f47ca9fca8215f8cbf556218) правда я не разобрался зачем тут нужен был RANK(). Думаю filter nrow = 1 тут достаточно: берём только первую (итоговую) сумму в заказе.
Ну, если нравится -- то и хорошо. Но эта версия вообще не интересуется значением поля suma при фильтрацыи записей, то есть делает совсем не то, что вы просили.
Обсуждают сегодня