172 похожих чатов

День добрый. в PostgreSQL ещё нет поддержки DISTINCT для window

функций. Для этого можно использовать подзапрос с 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 функций? какие проблемы остались не решенными?

9 ответов

11 просмотров

Да в общем так, да, только я бы вместо попыток сравнения 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 там.

Eugen- Автор вопроса
Ilya Anfimov
А, ещё array_agg(id) кажэтся имеет право быть нест...

понятно. Значит всё-таки оставить подзапросом и не морочить себе я... голову )

Eugen
понятно. Значит всё-таки оставить подзапросом и не...

Странный вывод, но ничего не имею против, конечно.

Eugen- Автор вопроса
Eugen- Автор вопроса
Ilya Anfimov
Да в общем так, да, только я бы вместо попыток сра...

Сейчас буду пробовать ваше предолжение по поводу RANK

Eugen
Сейчас буду пробовать ваше предолжение по поводу R...

Лучшэ, для начала, проверь что sq.agreement_id=usage.agreement_id работает такжэ. Не в смысле результата (этот можэт случайно совпасть), а в смысле индекса.

Eugen- Автор вопроса
Ilya Anfimov
Да в общем так, да, только я бы вместо попыток сра...

Кстати, с rownumber всё получилось прекрасно [dbfiddle](https://dbfiddle.uk/?rdbms=postgres_13&fiddle=01c699f3f47ca9fca8215f8cbf556218) правда я не разобрался зачем тут нужен был RANK(). Думаю filter nrow = 1 тут достаточно: берём только первую (итоговую) сумму в заказе.

Eugen
Кстати, с rownumber всё получилось прекрасно [dbfi...

Ну, если нравится -- то и хорошо. Но эта версия вообще не интересуется значением поля suma при фильтрацыи записей, то есть делает совсем не то, что вы просили.

Похожие вопросы

Обсуждают сегодня

Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
10
А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
48
Есть предложения, как подобное можно упростить?
Hemul GM
12
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
У меня вопросик назрел. Почему, создав класс без наследования и реализации деструктора Destroy, деструктор не вызывался при free. Потом указал наследование от tobject и overri...
Сергей Бычков
9
@y0zhig @shizzard А можно я опишу цель и может вообще ерланг мне не подходит. На текущий момент как я понимаю у ерланга есть легковесные потоки и задача выполняется в каком т...
Дмитрий Спиридонов
5
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
Такой вопросец - есть функция function MySuperDuperConcat(const a: array of AnsiString): AnsiString; Как мне в её теле сделать вот так? Result:=Concat(a); А не грустный вариан...
notme
15
just use free version ?? pycharm has a free version
Fan / Ac
9
Карта сайта