Как стать автором
Обновить

Комментарии 15

все написано максимально простым языком для базового понимания.

Если это для базового понимания, для начинающих, то я бы добавил несколько строк SQL, которые бы показали как была создана БД :


image


Матариал от этого только выиграет.

спасибо за комментарий!
прислушался и добавил в SQL запросы создание и наполнение таблиц данными

Всё сразу встало на свои места.

Оконная функция в SQL - функция, которая работает с выделенным набором строк (окном, партицией) и выполняет вычисление для этого набора строк в отдельном столбце. 

Сей текст явно ставит знак равенства между окном и партицией. Что является явной ошибкой.

Партиции (окна из набора строк) - это набор строк, указанный для оконной функции по одному из столбцов или группе столбцов таблицы. Партиции для каждой оконной функции в запросе могут быть разделены по различным колонкам таблицы.

Выражение партиции - никак не ограничено списком "по одному из столбцов или группе столбцов таблицы". Практически любое выражение - допустимо, единственное требование - скалярный результат выражения. Во всяком случае, я собственными глазами видел практический запрос, где выражение партиционирования включало коррелированный подзапрос. Вполне рабочий запрос.

Синтаксис оконных функций вне зависимости от их класса будет так или иначе состоять из идентичных команд.

FILTER clause поддерживается не в каждой СУБД.

спасибо за комментарий!
окно, партиция != фрейм окна (опять же правильно ли называть партицию окном - извечный вопрос определения, переведенного с иностранного языка), не стоит этим усложнять жизнь начинающим аналитикам - важно понять суть работу функций. про СУБД не уточнял где и что работает - опять же считаю это лишним условием в общем обзоре материала. "скалярный результат" и "коррелированный подзапрос", ну согласитесь же, что это звучит сильно сложно и непонятно для людей-новичков? Цель статьи - максимально упростить понимание и принцип работы, а не накидать множество условий и ограничений (это уже с опытом и насмотренностью придет, как и у вас)

окно, партиция != фрейм окна (опять же правильно ли называть партицию окном — извечный вопрос определения, переведенного с иностранного языка)

Интересно, а почему не использовать терминологию Microsoft?


  • Окно
  • Рамка окна
  • Секция
  • Секционирование?

 "скалярный результат" и "коррелированный подзапрос", ну согласитесь же, что это звучит сильно сложно и непонятно для людей-новичков?

Ну если насчёт "коррелированного запроса" ещё туда-сюда, то насчёт "скалярного значения" - категорически не согласен. Новичок в SQL - это не полный дундук, порог входа в SQL-программирование совсем даже не нулевой. Он просто обязан обладать хотя бы каким-то минимальным набором знаний по математике, логике и программированию. И соответственно минимальной терминологией владеть тоже обязан.

А если не обладает - так он рано пришёл, пусть сперва букварь освоит.

Спасибо! Дополню от себя: есть немного нетипичное, но очень эффективное применение оконных функций: row_number() - очень помогает при поиске и удалении дубликатов в (плохо спроектированных) таблицах

очень помогает при поиске и удалении дубликатов

Это как раз очевидное и тривиальное применение. Если этот вариант чем и интересен - так это правильными синтаксисом (ооо! написать правильный запрос для MySQL - вот где спотыкается половина начинающих!).

Если уж задумываться о не самых очевидных применениях - то начинать надо с чего-нибудь вроде "gaps and islands".

Я в первые читаю про оконные функции, до этого только слышал обрывки. Благодарен за эту вводную статью.

А можете подсказать, что было бы в последнем примере с функциями смещения, если бы там был не только Петя, но и Маша, как в других примерах?

Просто сложилось впечатление, что тогда будет одна большая портиция и корректно на стыке имён функция не отработает, особенно если добавлять строки непоследовательно (Маша, Петя, Маша,...)

Для первого знакомства с аналитическими функциями неплохо, но все же стоит отметить, что в каждом диалекте (oracle / postgres / sql-server) свои особенности синтаксиса и свои особенности выполнения. Приведенные вами примера синтаксиса встречается разве что только в Postgres. И в postgres для аналитических функций нужно не забывать про указание window frame (https://www.postgresql.org/docs/current/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS) иначе получим полную ерунду.

Раньше работал с 1С и писал много сложных отчетов и соответсвенно сложных запросов. Сейчас прочитал про оконные функции и понял на сколько же это классная вещь!

В самом 1С язык запросов это по сути переведенный на русский язык SQL, с небольшими отличиями от оригинала и ограничениями. Можно сказать такой диалект SQL. Некоторые вещи в нем не реализованы, на сколько я знаю, оконные функции тоже. Поэтому для того чтобы получить подобное приходилось порой такого наворотить с джойнами и виртуальными таблицами! Одно хорошо, что руками, это все в основном не пишешь, а мышкой поля в конструкторе перетаскиваешь - удобно было.

Хотелось бы подробнее узнать про window frame, а так спасибо за пост, очень полезно!

не плохо, но не хватает про сортировку в агрегатирующих функциях и её влияние на общую сортировку результата

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории