powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Использование window функций
25 сообщений из 25, страница 1 из 1
Использование window функций
    #36418357
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем понятно в какую ветку, но так как вопрос охватывает все СУБД решил запостить сюда.

В каких СУБД можно использовать window функций в качестве выражений? Речь идет о такого рода запросах :

SELECT (SUM(col1) OVER (ORDER BY col2))/col3 FROM ....

или

SELECT .... FROM table1 JOIN table2 ON table2.col1 = (SUM(col1) OVER (ORDER BY col2))

Искать и ставить все возможные СУБД достаточно проблематично, поэтому может кто-то работал с window функциями и знает. Интересуют прежде всего PostgreSQL, MSSQL, Oracle, MySQL, Firebird, DB2. Последние 3 правда не уверен что вообще поддерживают window функции.
...
Рейтинг: 0 / 0
Использование window функций
    #36418386
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieНе совсем понятно в какую ветку, но так как вопрос охватывает все СУБД решил запостить сюда.

В каких СУБД можно использовать window функций в качестве выражений? Речь идет о такого рода запросах :

SELECT (SUM(col1) OVER (ORDER BY col2))/col3 FROM ....

или

SELECT .... FROM table1 JOIN table2 ON table2.col1 = (SUM(col1) OVER (ORDER BY col2))

Искать и ставить все возможные СУБД достаточно проблематично, поэтому может кто-то работал с window функциями и знает. Интересуют прежде всего PostgreSQL, MSSQL, Oracle, MySQL, Firebird, DB2. Последние 3 правда не уверен что вообще поддерживают window функции.
В Оракле есть, называются там аналитическими ф-ями.
...
Рейтинг: 0 / 0
Использование window функций
    #36418400
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В MySQL такого нет.
...
Рейтинг: 0 / 0
Использование window функций
    #36418405
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftВ MySQL такого нет.хотя ряд задач такого рода решается с помощью переменных.
...
Рейтинг: 0 / 0
Использование window функций
    #36418465
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkiePostgreSQLможно, начиная с текущего релиза 8.4 http://www.postgresql.org/docs/current/static/tutorial-window.html
...
Рейтинг: 0 / 0
Использование window функций
    #36418539
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, еще раз, не вопрос поддерживаются ли window функции... Вопрос можно ли их использовать не только как :
SELECT SUM(col1) OVER (ORDER BY col2) FROM ..., но и брать в скобки - делить, умножать на другие колонки, использовать в условиях Join и т.п. (как я сверху написал)

То есть как грамматика построена, после "," она смотрит, что либо window функция, либо выражение. Или window функция один из видов выражений (типа как обычная функция)
...
Рейтинг: 0 / 0
Использование window функций
    #36418554
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... в PostgreSQL походу их нельзя в GROUP BY и WHERE использовать (что в моем случае не так страшно), но видимо можно в выражениях и нельзя в условиях JOIN, хотя не факт....
...
Рейтинг: 0 / 0
Использование window функций
    #36418615
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieХм... в PostgreSQL походу их нельзя в GROUP BY и WHERE использовать (что в моем случае не так страшно), но видимо можно в выражениях и нельзя в условиях JOIN, хотя не факт....да:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT (SUM(col1) OVER (ORDER BY col2))/col3 FROM t;
 ?column?
----------
( 0  rows)

SELECT (SUM(col1) OVER (ORDER BY col2))/col3 FROM t where (SUM(col1) OVER (ORDER BY col2))/col3 !=  10 ;
ERROR:  window functions not allowed in WHERE clause

SELECT (SUM(col1) OVER (ORDER BY col2))/col3 FROM t group by (SUM(col1) OVER (ORDER BY col2))/col3, col3, col2;
ERROR:  window functions not allowed in GROUP BY clause

SELECT (SUM(a.col1) OVER (ORDER BY a.col2))/a.col3 FROM t a join t b on (SUM(a.col1) OVER (ORDER BY a.col2))/a.col3 >  10 ;
ERROR:  window functions not allowed in JOIN conditions
...
Рейтинг: 0 / 0
Использование window функций
    #36418656
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёш, спасибо большое... С Postgre разобрались

В Oracle'е судя по примерам та же байда, видно обусловлена особенностями реализации (что означает что использовать их нужно крайне осторожно, так как видимо window функции почти никак не оптимизируются)

А вот с MS SQL не понятно, может мелкософтовцы "обошли" остальных, правда слабо верится :)
...
Рейтинг: 0 / 0
Использование window функций
    #36418720
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что мешает запрос с оконными/аналитическими функциями убрать в подзапрос и уже его "делить, умножать на другие колонки, использовать в условиях Join и т.п." ?
...
Рейтинг: 0 / 0
Использование window функций
    #36418755
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieЁш, спасибо большое... С Postgre разобрались

В Oracle'е судя по примерам та же байда, видно обусловлена особенностями реализации (что означает что использовать их нужно крайне осторожно, так как видимо window функции почти никак не оптимизируются)

А вот с MS SQL не понятно, может мелкософтовцы "обошли" остальных, правда слабо верится :)
В MSSQL нельзя order для SUM. LAG/LEAD отсутствует, "Оконные функции могут использоваться только в предложениях SELECT или ORDER BY".
...
Рейтинг: 0 / 0
Использование window функций
    #36418964
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Можно, но там где мне надо не очень удобно... Кроме того это как я уже писал означает, что оптимизация таких запросов никакая...
...
Рейтинг: 0 / 0
Использование window функций
    #36418967
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зайцев Фёдор,

Что значит нельзя order для SUM?

Но первый запрос что писал Еш все же пройдет?
...
Рейтинг: 0 / 0
Использование window функций
    #36419369
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkie,

а все-таки почитать сначала документацию на соответствующий продукт не пробовали?
...
Рейтинг: 0 / 0
Использование window функций
    #36419585
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieКроме того это как я уже писал означает, что оптимизация таких запросов никакая...Это смотря с чем сравнивать. Если с наворотами, которые требовались бы, если бы не было оконных/аналитических функций, то оптимизация будет еще какая!
...
Рейтинг: 0 / 0
Использование window функций
    #36419616
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
А как вообще должна выполнятся аналитическая функция например в where???
Значение аналитической функции зависит от всей выборки. Добавляем в where аналитическую функцию, значит меняется выборка, значит меняется значение аналитической функции получаем замкнутый круг. Если в выборке 2 предиката с аналитическими функциями то получается вообще ужас.
...
Рейтинг: 0 / 0
Использование window функций
    #36419796
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?,

Точно, что-то я не сразу это заметил, что она по выборке запроса работает, а не по всем данным... Впрочем это ответ на вопрос Aaron'а - пробовал читать, но даже мелкософтавская документация не сильно структурирована, чтобы выцепить в ней необходимую информацию, например про использование Window Aggregate Functions в Where... Я уж молчу про Oracle и остальных... :)

Тогда смежный вопрос, а можно как-нить заставить чтобы ORDER BY пропускал null'ы? А то есть только nulls first и nulls last а чтобы их вообще не брать нету :(
...
Рейтинг: 0 / 0
Использование window функций
    #36419807
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieТогда смежный вопрос, а можно как-нить заставить чтобы ORDER BY пропускал null'ы? А то есть только nulls first и nulls last а чтобы их вообще не брать нету :(WHERE myfield IS NOT NULL чем не подходит?
...
Рейтинг: 0 / 0
Использование window функций
    #36419888
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Тем что придется делать вложенный запрос для этой Window Function, который опять таки непонятно как оптимизируется...
...
Рейтинг: 0 / 0
Использование window функций
    #36419909
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkiemiksoft,

Тем что придется делать вложенный запрос для этой Window FunctionЗачем? что мешает добавить это условие к уже имеющимся условиям в секции WHERE ?Nitro_Junkie, который опять таки непонятно как оптимизируется...За Оракл не переживайте, его оптимизатор достаточно неплохо умеет раскрывать вложенные запросы.
Кстати, именно условие IS NOT NULL в ряде случаев позволяет строить значительно более быстрые планы запросов, чем без него.
...
Рейтинг: 0 / 0
Использование window функций
    #36420087
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

А мне не надо чтобы весь запрос фильтровался по не null'ам Order'ов, мне нужно чтобы аналитическая функция не рассматривала null'евые order'ы и давала для них null. Можно конечно вставить Case when в выражение, в order'ы null first а потом все обернуть в CASE WHEN чтоб не 0, но как-то это не очень красиво.

Почему-то при тесте на генерируемых запросах с адаптерами разных БД, Oracle показал существенно более плохие результаты чем все остальные. Конечно может его надо долго и нудно "настраивать", но не понятно почему он не может это сделать сам как другие...
...
Рейтинг: 0 / 0
Использование window функций
    #36420165
alecsey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieА мне не надо чтобы весь запрос фильтровался по не null'ам Order'ов, мне нужно чтобы аналитическая функция не рассматривала null'евые order'ы и давала для них null. Можно конечно вставить Case when в выражение, в order'ы null first а потом все обернуть в CASE WHEN чтоб не 0, но как-то это не очень красиво.бред какой то, можно конкретную задачу?

Nitro_JunkieПочему-то при тесте на генерируемых запросах с адаптерами разных БД, Oracle показал существенно более плохие результаты чем все остальные. Конечно может его надо долго и нудно "настраивать", но не понятно почему он не может это сделать сам как другие...давай сюда тесты
...
Рейтинг: 0 / 0
Использование window функций
    #36420175
alecsey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkieв PostgreSQL походу их нельзя в GROUP BY и WHERE использовать (что в моем случае не так страшно), но видимо можно в выражениях и нельзя в условиях JOIN, хотя не факт....логично, если аналитическая функция находится в WHERE блоке то не понятно над каким множеством она должна вычислятся?
...
Рейтинг: 0 / 0
Использование window функций
    #36420228
Favn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nitro_Junkie... DB2. ...не уверен что вообще поддерживают window функции."Птичку нашу попрошу не обижать!" (с) Есть они, конечно, в DB2 , они там появились еще до появления в SQL:2003.
Nitro_Junkieиспользовать их нужно крайне осторожно, так как видимо window функции почти никак не оптимизируютсяИ что же это Вы про Оракл так уничижительно? :) Не поверю, что в нормальной СУБД есть конструкции SQL, которые "почти никак не оптимизируются". Иначе место было бы такой СУБД с ее оптимизатором... Ну, все поняли, где.
...
Рейтинг: 0 / 0
Использование window функций
    #36420247
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecsey,

Один запрос в котором я получаю скажем остатки по партиям, и накапливающиеся остатки по дате прихода, но при этом хочу, чтобы те у кого не задана дата прихода не учитывались. То что сходу смог придумать...

Тесты в каком виде ? проект выложить? В любом случае это наблюдение, может просто ораклу мало памяти на сервере дали или че-нить еще, не знаю, но целью проверить кто из СУБД быстрее пока не ставили...
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Использование window функций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]