Какво представляват функциите на прозореца?
Функциите на прозореца позволяват на потребителите да извършват изчисления спрямо дялове (т.е. подгрупи или секции) на набор от резултати, обикновено таблица или резултати от друга заявка. За разлика от традиционните функции за агрегиране, които връщат само една стойност за всяка група, дефинирана в заявката, функциите на прозореца връщат една стойност за всеки входен ред.
Как са полезни функциите на прозореца?
Функциите на прозореца повишават ефективността и намаляват сложността на заявките, които анализират дялове (прозорци) на набор от данни, като предоставят алтернатива на по-сложните SQL концепции, напр. производни заявки. Често срещаните случаи на употреба включват:
- Резултати от класиране в рамките на конкретен прозорец (напр. класиране по група)
- Достъп до данни от друг ред в конкретен прозорец (напр. отчитане за периоди)
- Агрегиране в конкретен прозорец (напр. текущи суми):
Как да използвате функциите на прозореца
Функциите на прозореца се инициират с OVER
клауза и са конфигурирани с помощта на три концепции:
- прозоречен дял (
PARTITION BY
) - групира редовете в дялове - подреждане на прозорците (
ORDER BY
) - дефинира реда или последователността на редовете във всеки прозорец - прозоречна рамка (
ROWS
) - дефинира прозореца чрез използване на отместване от посочения ред
Преглед на синтаксиса
function (expression) OVER
( [ PARTITION BY expression_list ]
[ ORDER BY order_list ]
[ ROWS frame_clause ])
Дефиниции
- expression_list:разделен със запетая списък с изрази, обикновено имена на колони
- order_list:разделен със запетая списък с изрази, обикновено имена на колони
- frame_clause:дефинирайте отместването с помощта на
CURRENT ROW
,_value_ PRECEDING
,UNBOUNDED PRECEDING
,_value_ FOLLOWING
,UNBOUNDED FOLLOWING
Примери
Класиране:класиране по група
SELECT
campaign
, month
, total_cost
, rank() OVER (PARTITION BY month ORDER BY month DESC, total_cost DESC) as "rank"
FROM Cost_by_Month
LIMIT 8
Предишен ред:анализ на период над период
SELECT
campaign
, month
, total_cost
, LAG(total_cost, 1) OVER (ORDER BY campaign, month) as "previous total cost"
FROM Cost_by_Month
WHERE campaign = 'TV'
LIMIT 4
Агрегация в рамките на прозорец:текущи суми
SELECT
campaign, month, monthly_cost
, sum(monthly_cost) OVER (PARTITION BY campaign ORDER BY month ROWS BETWEEN UNBOUNDED
PRECEDING and CURRENT ROW) as "running cost total"
FROM Cost_by_Month
Списък с документация и функции:
Моля, имайте предвид, че съществуват фини разлики в употребата и синтаксиса от база данни до база данни. За информация, специфична за вашата реализация, моля, използвайте специфичната за източника документация, предоставена по-долу.
Postgres
- Урок
- Функции
Червено отместване
- Урок
- Функции
Oracle
- Урок
SQLServer
- Урок
BigQuery
- Урок