MIN MAX LIMIT TOP ROW_NUMBER CTE
Na jednoduchých příkladech si ukážeme, že analýza dat pomocí SQL je rychlá a snadná. Další výhodou těchto příkladů je, že se podobná zadání objevují u pohovorů. 😉
Pokud nemáte databázový server nainstalovaný lokálně, můžete využít SQL v cloudu. Např. sqliteonline.com nebo sqlfiddle.com.
Vytvoření databáze
Nejdřív si vytvoříme databázi a v ní několik řádků.
CREATE TABLE prodej
(
id INT,
zakaznik VARCHAR(100),
celkem DECIMAL(8,2)
);
INSERT INTO prodej VALUES (1, 'Dovoz potravin, s.r.o.', 150000);
INSERT INTO prodej VALUES (2, 'Prodej textilu, a.s.', 20000);
INSERT INTO prodej VALUES (3, 'Zážitková agentura, s.r.o.', 350000);
INSERT INTO prodej VALUES (4, 'Restaurace a stravování, spol s r.o.', 1000);
INSERT INTO prodej VALUES (5, 'Průmysl, a.s.', 900000);
1. Zobrazte zákazníka s nejvyšším obratem
Použijeme poddotaz (subquery) a funkci MAX
, která vrací nejvyšší hodnotu.
SELECT *
FROM prodej
WHERE celkem = (
SELECT MAX(celkem)
FROM prodej
);
id | zakaznik | celkem
---+---------------+----------
5 | Průmysl, a.s. | 900000.00
2. Zobrazte zákazníka s nejnižším obratem
Budeme postupovat stejně, jako v předchozím příkladě, jen použijeme funkci MIN
, která vrací nejnižší hodnotu.
SELECT *
FROM prodej
WHERE celkem = (
SELECT MIN(celkem)
FROM prodej
);
id | zakaznik | celkem
---+--------------------------------------+--------
4 | Restaurace a stravování, spol s r.o. | 1000.00
3. Zobrazte první tři zákazníky podle obratu
Seřadíme si data pomocí ORDER BY
a pak použijeme funkci LIMIT
/TOP
.
-- PostgreSQL
SELECT *
FROM prodej
ORDER BY celkem DESC
LIMIT 3;
-- SQL Server
SELECT TOP 3 *
FROM prodej
ORDER BY celkem DESC
id | zakaznik | celkem
---+----------------------------+----------
5 | Průmysl, a.s. | 900000.00
3 | Zážitková agentura, s.r.o. | 350000.00
1 | Dovoz potravin, s.r.o. | 150000.00
4. Vyberte zákazníka, který má druhý nejvyšší obrat
Zde využijeme CTE (Common Table Expressions) a funkci ROW_NUMBER
, která nám "očísluje" vrácené řádky.
Výhodou tohoto postupu je, že snadno můžeme vybírat zákazníky podle obratu pouhou změnou čísla.
WITH zakaznici AS (
SELECT ROW_NUMBER() OVER (ORDER BY celkem DESC) AS rn, *
FROM prodej
)
SELECT * FROM zakaznici
WHERE rn = 2; -- Druhý nejvyšší obrat
rn | id | zakaznik | celkem
---+----+----------------------------+----------
2 | 3 | Zážitková agentura, s.r.o. | 350000.00