Функции на SQL сървър
В системите за бази данни като цяло и в SQL Server в частност функциите са части от код, които приемат нула или един вход и връщат единичен изход или масив.
Функциите със стойности на таблица, които обикновено са дефинирани от потребителя, могат да връщат масив, но вградените функции на SQL Server обикновено са функции със скаларна стойност. Третият клас функции в SQL Server са функции с агрегатирана стойност. Функциите MIN и MAX на SQL Server са функции с обобщена стойност.
Функциите на прозореца са сравнително нов клас. Те извършват изчисления като агрегатни функции, но го правят върху набор от редове, свързани с текущия ред. Докато агрегатната функция вероятно ще даде един резултат, като работи върху колона, функцията на прозореца е по-вероятно да даде резултат за всеки ред.
Класификацията на функциите на SQL Server може също да се основава на тип данни – низови функции, числови функции и функции за дата. Можем да заключим, че низовите функции работят върху стойности на низове, напр. LENGTH().
MIN &MAX
Функциите MIN и MAX са много прости агрегатни функции. Все пак те могат да отговорят на голямо разнообразие от въпроси в зависимост от набора от данни, с който имаме работа.
Например, когато издаваме израза SELECT, ние задаваме на SQL Server въпрос . Следователно, ние казваме, че изпълняваме заявка . За да попитаме SQL Server за минималните и максималните стойности в колона, използваме следния синтаксис:
SELECT MIN(column_name) FROM table_name;
SELECT MAX(column_name) FROM table_name;
Когато използваме този синтаксис, SQL Server връща една стойност. По този начин можем да разгледаме функциите MIN() и MAX() Функции със скаларна стойност.
Списък 1 показва простото изявление за извличане на минималните и максималните стойности на товарното тегло от Sales.Orders таблица на TSQLV4 на Itzik Bengan база данни:
-- Listing 1: Basic MIN() and MAX() Function Queries
USE TSQLV4
GO
SELECT * FROM [Sales].[Orders];
-- Without Column Aliases
SELECT MIN(freight) FROM [Sales].[Orders];
SELECT MAX(freight) FROM [Sales].[Orders];
-- Without Column Aliases
SELECT MIN(freight) min_freight FROM [Sales].[Orders];
SELECT MAX(freight) max_freight FROM [Sales].[Orders];
ГРУПИРАНЕ ПО
„Какви са минималното и максималното тегло на товара за държава?“ За да отговорим на този въпрос, се нуждаем от GROUP BY клауза. Примерът е в листинг 2 по-долу.
Заявката първо групира данните по страна на кораба, и след това връща съответно минималното и максималното тегло на товара за всяка страна. Можем да потвърдим това, като издадем последната заявка в списъка (валидиране).
-- Listing 2: MIN and MAX Freight By Country
-- Minimum by Country
SELECT shipcountry, MIN(freight) min_freight FROM [Sales].[Orders]
GROUP BY shipcountry;
-- Maximum by Country
SELECT shipcountry, MAX(freight) max_freight FROM [Sales].[Orders]
GROUP BY shipcountry;
-- Validation
SELECT * FROM [Sales].[Orders] WHERE shipcountry='Finland'
ORDER BY freight;
-- Listing 2: MIN and MAX Freight by Country
-- Minimum by Customer
SELECT custid, MIN(freight) min_freight FROM [Sales].[Orders]
GROUP BY custid;
-- Maximum by Customer
SELECT custid, MAX(freight) max_freight FROM [Sales].[Orders]
GROUP BY custid;
-- Validation
SELECT * FROM [Sales].[Orders] WHERE custid='23'
ORDER BY freight;
Фигура 3 показва резултатите. Можем да направим нещо подобно с друга колона – custid колона. В този случай ние отговаряме на въпроса „Какъв е минималният и максималният страх за всеки клиент?“
Още въпроси
Можем да изследваме данните допълнително, за да разберем кои държави имат товарни тегла по-малко от 1 или повече от 800. Правим това с помощта на HAVING клауза, която филтрира набори от резултати, сегментирани в групи от GROUP BY клауза.
-- Listing 3: Introducing the HAVING Clause
SELECT shipcountry, MIN(freight) min_freight FROM [Sales].[Orders]
GROUP BY shipcountry
HAVING MIN(freight)<1;
SELECT shipcountry, MAX(freight) max_freight FROM [Sales].[Orders]
GROUP BY shipcountry
HAVING MAX(freight)>800;
Работа с дати
Когато прилагаме функциите MIN() и MAX() към дати, очакваме да видим най-ранните и най-новите дати съответно. Разгледайте примерите – датите се съхраняват като цели числа вътрешно в SQL Server.
-- Listing 4: Working with Dates
SELECT MIN(orderdate) earliest_date FROM [Sales].[Orders];
SELECT MAX(orderdate) latest_date FROM [Sales].[Orders];
Можем да копаем по-дълбоко, като попитаме кой клиент е направил първата поръчка и кой клиент е направил най-новата поръчка. За това използваме кода в листинг 5. Фигура 6 показва, че custid 85 клиент изпълни най-ранната поръчка, докато поръчителят 9 клиент направи последната поръчка.
-- Listing 5: Customer Order Dates
SELECT custid, MIN(orderdate) earliest_date FROM [Sales].[Orders]
GROUP BY custid
ORDER BY earliest_date;
SELECT custid, MAX(orderdate) latest_date FROM [Sales].[Orders]
GROUP BY custid
ORDER BY latest_date desc;
Заключение
В тази статия демонстрирахме накратко използването на агрегатните функции MIN() и MAX() в SQL Server. Ролята на тези функции е да връщат минималните и максималните стойности за даден диапазон, съхранени в колона на таблица.
Можем да отговорим на повече въпроси с тези функции, като ги комбинираме с други T-SQL команди, като клаузите GROUP BY, ORDER BY и HAVING.
Много инструменти опростяват и ускоряват изпълнението на такава задача и можете да изберете всяко решение, което отговаря на вашите изисквания. Сред тях SQL Complete от Devart извършва всички необходими манипулации и предоставя функция на SSMS Grid Aggregate на място, която изчислява MIN, MAX и AVG на избраните стойности в мрежата.