|
|
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Не совсем понятно в какую ветку, но так как вопрос охватывает все СУБД решил запостить сюда. В каких СУБД можно использовать 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 функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 15:39 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
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 функции. В Оракле есть, называются там аналитическими ф-ями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 15:48 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
В MySQL такого нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 15:52 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
miksoftВ MySQL такого нет.хотя ряд задач такого рода решается с помощью переменных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 15:53 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkiePostgreSQLможно, начиная с текущего релиза 8.4 http://www.postgresql.org/docs/current/static/tutorial-window.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 16:15 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Нет, еще раз, не вопрос поддерживаются ли window функции... Вопрос можно ли их использовать не только как : SELECT SUM(col1) OVER (ORDER BY col2) FROM ..., но и брать в скобки - делить, умножать на другие колонки, использовать в условиях Join и т.п. (как я сверху написал) То есть как грамматика построена, после "," она смотрит, что либо window функция, либо выражение. Или window функция один из видов выражений (типа как обычная функция) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 16:42 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Хм... в PostgreSQL походу их нельзя в GROUP BY и WHERE использовать (что в моем случае не так страшно), но видимо можно в выражениях и нельзя в условиях JOIN, хотя не факт.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 16:46 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkieХм... в PostgreSQL походу их нельзя в GROUP BY и WHERE использовать (что в моем случае не так страшно), но видимо можно в выражениях и нельзя в условиях JOIN, хотя не факт....да: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 17:02 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Ёш, спасибо большое... С Postgre разобрались В Oracle'е судя по примерам та же байда, видно обусловлена особенностями реализации (что означает что использовать их нужно крайне осторожно, так как видимо window функции почти никак не оптимизируются) А вот с MS SQL не понятно, может мелкософтовцы "обошли" остальных, правда слабо верится :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 17:13 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
А что мешает запрос с оконными/аналитическими функциями убрать в подзапрос и уже его "делить, умножать на другие колонки, использовать в условиях Join и т.п." ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 17:33 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkieЁш, спасибо большое... С Postgre разобрались В Oracle'е судя по примерам та же байда, видно обусловлена особенностями реализации (что означает что использовать их нужно крайне осторожно, так как видимо window функции почти никак не оптимизируются) А вот с MS SQL не понятно, может мелкософтовцы "обошли" остальных, правда слабо верится :) В MSSQL нельзя order для SUM. LAG/LEAD отсутствует, "Оконные функции могут использоваться только в предложениях SELECT или ORDER BY". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 17:41 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
miksoft, Можно, но там где мне надо не очень удобно... Кроме того это как я уже писал означает, что оптимизация таких запросов никакая... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 19:05 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Зайцев Фёдор, Что значит нельзя order для SUM? Но первый запрос что писал Еш все же пройдет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 19:07 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie, а все-таки почитать сначала документацию на соответствующий продукт не пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2010, 01:55 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkieКроме того это как я уже писал означает, что оптимизация таких запросов никакая...Это смотря с чем сравнивать. Если с наворотами, которые требовались бы, если бы не было оконных/аналитических функций, то оптимизация будет еще какая! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2010, 09:38 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
А как вообще должна выполнятся аналитическая функция например в where??? Значение аналитической функции зависит от всей выборки. Добавляем в where аналитическую функцию, значит меняется выборка, значит меняется значение аналитической функции получаем замкнутый круг. Если в выборке 2 предиката с аналитическими функциями то получается вообще ужас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2010, 09:55 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
?, Точно, что-то я не сразу это заметил, что она по выборке запроса работает, а не по всем данным... Впрочем это ответ на вопрос Aaron'а - пробовал читать, но даже мелкософтавская документация не сильно структурирована, чтобы выцепить в ней необходимую информацию, например про использование Window Aggregate Functions в Where... Я уж молчу про Oracle и остальных... :) Тогда смежный вопрос, а можно как-нить заставить чтобы ORDER BY пропускал null'ы? А то есть только nulls first и nulls last а чтобы их вообще не брать нету :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2010, 10:54 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkieТогда смежный вопрос, а можно как-нить заставить чтобы ORDER BY пропускал null'ы? А то есть только nulls first и nulls last а чтобы их вообще не брать нету :(WHERE myfield IS NOT NULL чем не подходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2010, 10:58 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
miksoft, Тем что придется делать вложенный запрос для этой Window Function, который опять таки непонятно как оптимизируется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2010, 11:19 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkiemiksoft, Тем что придется делать вложенный запрос для этой Window FunctionЗачем? что мешает добавить это условие к уже имеющимся условиям в секции WHERE ?Nitro_Junkie, который опять таки непонятно как оптимизируется...За Оракл не переживайте, его оптимизатор достаточно неплохо умеет раскрывать вложенные запросы. Кстати, именно условие IS NOT NULL в ряде случаев позволяет строить значительно более быстрые планы запросов, чем без него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2010, 11:23 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
miksoft, А мне не надо чтобы весь запрос фильтровался по не null'ам Order'ов, мне нужно чтобы аналитическая функция не рассматривала null'евые order'ы и давала для них null. Можно конечно вставить Case when в выражение, в order'ы null first а потом все обернуть в CASE WHEN чтоб не 0, но как-то это не очень красиво. Почему-то при тесте на генерируемых запросах с адаптерами разных БД, Oracle показал существенно более плохие результаты чем все остальные. Конечно может его надо долго и нудно "настраивать", но не понятно почему он не может это сделать сам как другие... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2010, 12:17 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkieА мне не надо чтобы весь запрос фильтровался по не null'ам Order'ов, мне нужно чтобы аналитическая функция не рассматривала null'евые order'ы и давала для них null. Можно конечно вставить Case when в выражение, в order'ы null first а потом все обернуть в CASE WHEN чтоб не 0, но как-то это не очень красиво.бред какой то, можно конкретную задачу? Nitro_JunkieПочему-то при тесте на генерируемых запросах с адаптерами разных БД, Oracle показал существенно более плохие результаты чем все остальные. Конечно может его надо долго и нудно "настраивать", но не понятно почему он не может это сделать сам как другие...давай сюда тесты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2010, 12:42 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkieв PostgreSQL походу их нельзя в GROUP BY и WHERE использовать (что в моем случае не так страшно), но видимо можно в выражениях и нельзя в условиях JOIN, хотя не факт....логично, если аналитическая функция находится в WHERE блоке то не понятно над каким множеством она должна вычислятся? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2010, 12:47 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie... DB2. ...не уверен что вообще поддерживают window функции."Птичку нашу попрошу не обижать!" (с) Есть они, конечно, в DB2 , они там появились еще до появления в SQL:2003. Nitro_Junkieиспользовать их нужно крайне осторожно, так как видимо window функции почти никак не оптимизируютсяИ что же это Вы про Оракл так уничижительно? :) Не поверю, что в нормальной СУБД есть конструкции SQL, которые "почти никак не оптимизируются". Иначе место было бы такой СУБД с ее оптимизатором... Ну, все поняли, где. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2010, 13:03 |
|
||
|
Использование window функций
|
|||
|---|---|---|---|
|
#18+
alecsey, Один запрос в котором я получаю скажем остатки по партиям, и накапливающиеся остатки по дате прихода, но при этом хочу, чтобы те у кого не задана дата прихода не учитывались. То что сходу смог придумать... Тесты в каком виде ? проект выложить? В любом случае это наблюдение, может просто ораклу мало памяти на сервере дали или че-нить еще, не знаю, но целью проверить кто из СУБД быстрее пока не ставили... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2010, 13:07 |
|
||
|
|

start [/forum/topic.php?fid=35&fpage=18&tid=1552845]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 11ms |
| total: | 164ms |

| 0 / 0 |
