Читатели като вас помагат в подкрепа на MUO. Когато правите покупка чрез връзки на нашия сайт, ние може да спечелим комисионна за партньор. Прочетете още.

Гъвкавостта на SQL като език за заявки за СУБД се повиши през годините. Неговата обширна полезност и гъвкавост го правят предпочитан за всички времена за всеки анализатор на данни.

Има доста функции на напреднало ниво освен обикновените на SQL. Тези функции са известни като прозоречни функции. Ако имате работа със сложни данни и искате да извършите разширени изчисления, можете да ги използвате, за да използвате данните си по най-добрия начин.

Значението на функциите на прозореца

В SQL са налични няколко прозоречни функции и всяка от тях ще ви помогне да извършите серия от изчисления. От създаване на дялове до класиране на редове или присвояване на номера на редове, тези прозоречни функции правят всичко по малко.

Функциите на прозореца са полезни, когато прилагате агрегатни функции върху конкретен набор от данни или колекция от редове. Тези функции надхвърлят функциите за агрегиране, които GROUP BY предоставя. Основната разлика обаче е, че за разлика от функцията за групиране, вашите данни не се комбинират в един ред.

Не можете да използвате прозоречни функции в рамките на КЪДЕТО, ОТ, и ГРУПИРАЙ ПО изявления.

Синтаксис на функция за прозорец

Когато се позовавате на която и да е функция на прозорец, трябва да следвате структурата на синтаксиса по подразбиране, така че да функционира правилно. Ако структурирате командата неправилно, ще получите грешка и вашият код няма да успее да се изпълни.

Ето синтаксиса по подразбиране:

ИЗБЕРЕТЕ име на колона1,
{window_function}(име на колона2)
НАД ([ДЯЛ ПО име на колона1] [ПОРЪЧКА ПО име на колона3]) КАТО нова_колона
ОТ име_на_таблица;

Където:

  • име на колона1 е първото име на колона, което искате да изберете.
  • {window_function} е името на агрегатна функция като sum, avg, count, row_number, rank или dense_rank.
  • име на колона2 е името на колоната, към която прилагате функцията прозорец.
  • име на колона3 е третото име на колона, което ще формира основата за дяла.
  • нова_колона е етикет за новата колона, която можете да приложите с помощта на КАТО ключова дума.
  • име_на_таблица е името на изходната таблица.

Функциите на прозореца са различни от някои от най-основните SQL команди. За разлика от агрегатните функции в SQL, можете да използвате тези прозоречни функции за изпълнение на разширени функции.

Подготовка на набора от данни

Можете да използвате СЪЗДАВАНЕ НА ТАБЛИЦА изявление към създайте нова таблица в SQL. Ето примерен набор от данни, който това ръководство ще използва, за да дефинира някои функции на прозореца:

Дата на поръчка

Категория

Цвят

Продажна цена

Количество

08-11-2016

телефони

черен

907.152

6

12-06-2016

Свързващи вещества

Зелено

18.504

3

11-10-2015

уреди

Жълто

114.9

5

11-10-2015

Маси

кафяво

1706.184

9

09-06-2014

телефони

червен

911.424

4

09-06-2014

Хартия

Бяло

15.552

3

09-06-2014

Свързващи вещества

черен

407.976

3

09-06-2014

уреди

Жълто

68.81

5

09-06-2014

Свързващи вещества

Зелено

2.544

3

09-06-2014

Съхранение

портокал

665.88

6

09-06-2014

Съхранение

портокал

55.5

2

15-04-2017

телефони

черен

213.48

3

05-12-2016

Свързващи вещества

Зелено

22.72

4

22-11-2015

уреди

Зелено

60.34

7

22-11-2015

Столове

Тъмно кафяво

71.372

2

13-05-2014

Мебели

портокал

190.92

5

Обяснена е функцията Sum

Да предположим, че искате да изчислите общите продажби за всяка стойност в колоната за категория. Ето как можете да го направите:

ИЗБЕРЕТЕкатегория, цвят,
сума (продажна_цена)
НАД (подреждане по категория) КАТО total_sales
ОТ sahil.sample;

В горния код SQL изразът изтегля категорията и цвета от оригиналния набор от данни. Функцията sum сумира колоната sale_price. Прави го по категория, тъй като клаузата OVER указва подреждане по колоната за категория. Крайният резултат е следният:

Как да използвате функцията за прозорец Avg().

Подобно на функцията за сумиране, можете да изчислите средната стойност за ред от данни с ср функция. Вместо сумата ще получите колона със средните продажби.

ИЗБЕРЕТЕкатегория, цвят,
ср. (продажна_цена)
НАД (подреждане по категория) AS avg_sales
ОТ sahil.sample;

Научете се да използвате функцията за прозорец Count().

Подобно на функциите sum и avg, функцията за прозорец за броене в SQL е доста проста и работи по същите линии като другите две функции. Когато подадете функцията за преброяване, получавате общия брой на всяка стойност в новата колона.

Ето как можете да изчислите броя:

ИЗБЕРЕТЕкатегория, цвят,
брой (категория)
НАД (подреждане по категория) AS item_count
ОТ sahil.sample;

Прозоречната функция Row_Number().

За разлика от някои други прозоречни функции, изброени по-горе, row_number() работи малко по-различно. Функцията row_number() присвоява номер на ред на всеки ред в зависимост от реда по клауза. Номерът на началния ред е 1; row_number присвоява съответната стойност на всеки ред до края.

Ето основната структура на функция row_number():

ИЗБЕРЕТЕкатегория, цвят,
номер_на_ред()
НАД (подреждане по категория) КАТО item_number
ОТ sahil.sample;

Но какво се случва, ако искате да присвоите отделни номера на редове за всеки елемент от категория? Горният синтаксис задава подвижен сериен номер, независимо от елементите, съхранени в категорията. Например категорията на уредите трябва да има своя ексклузивна номерация, последвана от свързващи елементи и т.н.

Можете да използвате преграда функция за изпълнение на тази проста, но практична задача. Ключовата дума за дял присвоява определени номера на редове на базата на всеки елемент от категория.

ИЗБЕРЕТЕкатегория, цвят,
номер_на_ред()
НАД (разделяне по категория подреждане по категория) КАТО item_number
ОТ sahil.sample;

Функциите Rank() и Dense_Rank().

The ранг () функцията работи по различен начин от номер_на_ред() функция. Трябва да посочите името на колоната в реда по функция, за да го използвате като основа за определяне на стойностите за ранг. Например в следния примерен код можете да използвате колоната за цвят в рамките на реда по функция. След това заявката ще използва този ред, за да присвои стойност на ранг на всеки ред.

Можете да използвате синтаксиса на кода по-долу, за да подадете функция за ранг в SQL:

ИЗБЕРЕТЕкатегория, цвят,
ранг ()
НАД (подреждане по цвят) AS item_rank
ОТ sahil.sample;

Разгледайте изхода, за да разберете как работи тази функция.

Подреждането по функция сортира цветовата категория, докато функцията за ранг присвоява ранг на всеки цвят. Въпреки това, всички едни и същи цветови стойности имат еднакъв ранг, докато различните цветове имат различни рангове. Черният цвят се среща три пъти в набора от данни; вместо да присвоите стойност на ранг 1, 2 и 3, елементите с черен цвят получават ранг 1.

Въпреки това, следващият цвят Кафяв получава ранг 4 вместо ранг 2. Функцията за ранг пропуска стойности и присвоява следващата хронологична стойност на различните записи. Ако искате да присвоите по-значима стойност на ранг, можете да използвате dense_rank() функция.

Функцията dense_rank не пропуска стойности за ранг по време на подреждането по функция. Например, първите три цветни елемента (черно) ще имат ранг 1. Въпреки това, следващият цвят (кафяв) няма да има ранг 4, а ранг 2, което е следният хронологичен номер в списъка с номерации. Функцията dense_rank е по-практична прозоречна функция, тъй като присвоява значима стойност на списъка с елементи.

Ето как можете да използвате функцията dense_rank в SQL:

ИЗБЕРЕТЕкатегория, цвят,
dense_rank()
НАД (подреждане по цвят) AS item_rank
ОТ sahil.sample;

И ето пример за това как ще изглежда изходът от тази функция:

SQL функциите на помощ

Прозоречните функции на SQL са идеални за извършване на разширени аналитични операции. Можете обаче да използвате много други SQL команди, за да сте сигурни, че изчислителните ви умения са първокласни. Когато комбинирате и изчислявате множество резултати наведнъж, няма нищо по-добро от използването на подзаявките на SQL.

Подзаявките са отличен инструмент за изпълнение на разширени функции, подобряващи качеството на вашите резултати. В зависимост от нуждите на часа можете да персонализирате вашите заявки и да ги направите по-ефективни, за да отговарят на вашите изисквания.