SQL Server-functies
In databasesystemen in het algemeen en in SQL Server in het bijzonder zijn functies stukjes code die nul of één invoer nodig hebben en een enkele uitvoer of een array retourneren.
Tabelwaardefuncties die doorgaans door de gebruiker worden gedefinieerd, kunnen een array retourneren, maar ingebouwde SQL Server-functies zijn doorgaans scalaire functies. De derde klasse van functies in SQL Server zijn geaggregeerde functies. De MIN en MAX SQL Server-functies zijn geaggregeerde functies.
Vensterfuncties zijn een relatief nieuwe klasse. Ze voeren berekeningen uit zoals aggregatiefuncties, maar doen dit over een reeks rijen die verband houden met de huidige rij. Terwijl een aggregatiefunctie waarschijnlijk een enkel resultaat oplevert door aan een kolom te werken, is de kans groter dat een vensterfunctie een resultaat oplevert voor elke rij.
De classificatie van SQL Server-functies kan ook gebaseerd zijn op het gegevenstype:tekenreeksfuncties, numerieke functies en datumfuncties. We kunnen afleiden dat tekenreeksfuncties werken op tekenreekswaarden, bijvoorbeeld LENGTH().
MIN &MAX
De MIN- en MAX-functies zijn zeer eenvoudige aggregatiefuncties. Toch kunnen ze een breed scala aan vragen beantwoorden, afhankelijk van de dataset waarmee we te maken hebben.
Wanneer we bijvoorbeeld de SELECT-instructie uitgeven, stellen we SQL Server een vraag . Daarom zeggen we dat we een query uitvoeren . Om SQL Server te vragen naar de minimum- en maximumwaarden in een kolom, gebruiken we de volgende syntaxis:
SELECT MIN(column_name) FROM table_name;
SELECT MAX(column_name) FROM table_name;
Wanneer we deze syntaxis gebruiken, retourneert SQL Server één waarde. We kunnen dus rekening houden met de functies MIN() en MAX() Scalar-Valued Functions.
Listing 1 geeft de eenvoudige verklaring weer om de minimum- en maximumwaarden voor het vrachtgewicht af te leiden uit de Sales.Orders tabel van de Itzik Bengan's TSQLV4 databank:
-- 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];
GROEP OP
"Wat zijn de minimale en maximale vrachtgewichten per land?" Om deze vraag te beantwoorden, hebben we de GROUP BY . nodig clausule. Het voorbeeld staat in Lijst 2 hieronder.
De zoekopdracht groepeert eerst de gegevens op shipcountry, en dan retourneert het respectievelijk het minimum en maximum vrachtgewicht per land. We kunnen dit bevestigen door de laatste vraag in de lijst op te geven (validatie).
-- 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;
Figuur 3 toont de resultaten. We kunnen iets soortgelijks doen met een andere kolom - de custid kolom. In dit geval beantwoorden we de vraag:"Wat is de minimale en maximale schrik voor elke klant?"
Meer vragen
We kunnen de gegevens verder onderzoeken om erachter te komen welke landen een vrachtgewicht hebben van minder dan 1 of meer dan 800. We doen dit met de HAVING clausule die resultatensets filtert die in groepen zijn gesegmenteerd door de GROUP BY clausule.
-- 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;
Werken met datums
Wanneer we de functies MIN() en MAX() toepassen op datums, verwachten we de vroegste en nieuwste respectievelijk data. Bekijk de voorbeelden – de datums worden intern in SQL Server opgeslagen als gehele getallen.
-- Listing 4: Working with Dates
SELECT MIN(orderdate) earliest_date FROM [Sales].[Orders];
SELECT MAX(orderdate) latest_date FROM [Sales].[Orders];
We kunnen dieper graven door te vragen welke klant de eerste bestelling heeft gedaan en welke klant de meest recente bestelling heeft gedaan. Daarvoor gebruiken we de code in Listing 5. Figuur 6 laat zien dat de custid 85 klant voerde de vroegste bestelling uit, terwijl de custid 9 klant heeft de laatste bestelling geplaatst.
-- 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;
Conclusie
In dit artikel hebben we kort het gebruik van de MIN() en MAX() aggregatiefuncties in SQL Server gedemonstreerd. De rol van deze functies is het retourneren van de minimum- en maximumwaarden voor een bepaald bereik dat is opgeslagen in een tabelkolom.
We kunnen met deze functies meer vragen beantwoorden door ze te combineren met andere T-SQL-commando's, zoals de clausules GROUP BY, ORDER BY en HAVING.
Veel tools vereenvoudigen en versnellen dergelijke taakuitvoering, en u kunt elke oplossing kiezen die aan uw vereisten voldoet. Onder hen doet SQL Complete van Devart alle noodzakelijke manipulaties en biedt het een interne SSMS Grid Aggregate-functie die MIN, MAX en AVG berekent van de geselecteerde waarden in het raster.