SQL-serverfunktioner
I databassystem i allmänhet och i SQL Server i synnerhet är funktioner kodbitar som tar noll eller en ingång och returnerar en enda utdata eller en array.
Tabell-värderade funktioner som vanligtvis är användardefinierade kan returnera en array, men inbyggda SQL Server-funktioner är vanligtvis skalärvärderade funktioner. Den tredje klassen av funktioner i SQL Server är Aggregate-Valued Functions. MIN- och MAX SQL Server-funktionerna är funktioner med aggregerade värden.
Fönsterfunktioner är en relativt ny klass. De utför beräkningar som aggregatfunktioner men gör det över en uppsättning rader relaterade till den aktuella raden. Medan en aggregerad funktion sannolikt ger ett enda resultat genom att arbeta på en kolumn, är det mer sannolikt att en fönsterfunktion ger ett resultat för varje rad.
Klassificeringen av SQL Server-funktioner kan också grundas på datatyp – strängfunktioner, numeriska funktioner och datumfunktioner. Vi kan härleda att strängfunktioner fungerar på strängvärden, t.ex. LENGTH().
MIN &MAX
MIN- och MAX-funktionerna är mycket enkla aggregatfunktioner. Ändå kan de svara på en mängd olika frågor beroende på vilken datauppsättning vi har att göra med.
Till exempel, när vi utfärdar SELECT-satsen ställer vi SQL Server en fråga . Därför säger vi att vi kör en fråga . För att fråga SQL Server om lägsta och högsta värden i en kolumn använder vi följande syntax:
SELECT MIN(column_name) FROM table_name;
SELECT MAX(column_name) FROM table_name;
När vi använder den här syntaxen returnerar SQL Server ett enda värde. Således kan vi överväga funktionerna MIN() och MAX() Skalärvärderade funktioner.
Lista 1 visar det enkla uttalandet för att härleda minimi- och maximivärdena på fraktvikten från Sales.Orders tabell över Itzik Bengans TSQLV4 databas:
-- 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];
GRUPPER EFTER
"Vilka är lägsta och högsta fraktvikter per land?" För att svara på den här frågan behöver vi GROUP BY klausul. Exemplet finns i Lista 2 nedan.
Frågan grupperar först data efter fartygsland, och sedan returnerar den lägsta och maximala fraktvikten per land. Vi kan bekräfta detta genom att utfärda den sista frågan i listan (validering).
-- 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;
Figur 3 visar resultaten. Vi kan göra något liknande med en annan kolumn – custid kolumn. I det här fallet svarar vi på frågan "Vad är minsta och maximala skräck för varje kund?"
Fler frågor
Vi kan undersöka data ytterligare för att ta reda på vilka länder som har fraktvikter mindre än 1 eller mer än 800. Vi gör detta med hjälp av HAVING klausul som filtrerar resultatuppsättningar segmenterade i grupper av GROUP BY klausul.
-- 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;
Arbeta med datum
När vi tillämpar funktionerna MIN() och MAX() på datum förväntar vi oss att se den tidigaste och senaste datum respektive. Ta en titt på exemplen – datumen lagras som heltal internt i SQL Server.
-- Listing 4: Working with Dates
SELECT MIN(orderdate) earliest_date FROM [Sales].[Orders];
SELECT MAX(orderdate) latest_date FROM [Sales].[Orders];
Vi kan gräva djupare genom att fråga vilken kund som gjorde den första beställningen och vilken kund som gjorde den senaste beställningen. För det använder vi koden i lista 5. Figur 6 visar att custid 85 kunder utförde den tidigaste beställningen, medan custid 9 kunder gjorde den senaste beställningen.
-- 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;
Slutsats
I den här artikeln demonstrerade vi kort användningen av MIN()- och MAX()-aggregatfunktionerna i SQL Server. Rollen för dessa funktioner är att returnera minimi- och maximivärdena för ett givet intervall lagrade i en tabellkolumn.
Vi kan svara på fler frågor med dessa funktioner genom att kombinera dem med andra T-SQL-kommandon som satserna GROUP BY, ORDER BY och HAVING.
Massor av verktyg förenklar och påskyndar sådana uppgifter, och du kan välja vilken lösning som helst som uppfyller dina krav. Bland dem gör SQL Complete från Devart alla nödvändiga manipulationer och tillhandahåller en SSMS Grid Aggregate-funktion på plats som beräknar MIN, MAX och AVG för de valda värdena i rutnätet.