Речь пойдет о так называемых analytic functions, которые оперируют над партициями данных (окна, windows), возвращая результат для каждой строки. В отличие от aggregate functions, “схлопывающих” строки, оконные функции оставляют все строки выборки.
Окно определяется спецификацией (выражение OVER) и основывается на трех основных концепциях:
▪Разбиение строк на группы (выражение PARTITION BY)
▪Порядок сортировки строк в каждой группе (выражение ORDER BY)
▪Рамки, которые определяют ограничения по количеству строк относительно каждой строки (выражение ROWS)
Таких функций существует немало, от аналитических: всем известные SUM, AVG, COUNT, менее известные LAG, LEAD, CUMEDIST, и до ранжирующих: RANK, ROWNUMBER, NTILE. Я же приведу несколько простых примеров часто встречающихся запросов:
▪Ко всем транзакциям пользователя вывести дату первой покупки
▪К каждой транзакции добавить дату предыдущей транзакции пользователя
▪Показать сумму покупок пользователя нарастающим итогом
▪Присвоить всем транзакциям пользователя / продавца / отделения порядковый номер
SQL Fiddle: http://sqlfiddle.com/#!17/ee00f/13
Решения:
select
salesid
,dateid
,sellerid
,buyerid
,qty
,first_value(dateid) over (partition by buyerid order by dateid) as first_purchase_dt
,lag(dateid) over (partition by buyerid order by dateid) as previous_purchase_dt
,sum(qty) over (partition by buyerid order by dateid rows between unbounded preceding and current row) as moving_qty
,row_number() over (partition by buyerid order by dateid) as order_number
from winsales
;Пишите свое решение в комментариях👇
@sqlhub
