NTH_VALUE() în MySQL

Valoarea din al N-lea rând al ferestrei (ex. a doua cea mai mare vânzare).

Sintaxă
NTH_VALUE(expresie, n) OVER (... ORDER BY ... [cadru])

Ce face NTH_VALUE()

NTH_VALUE() generalizează FIRST_VALUE(): alegi rândul cu numărul n. Ca la LAST_VALUE(), cadrul implicit se oprește la rândul curent, deci rândurile de dinaintea celui de-al N-lea primesc NULL.

Parametri

Parametru Descriere
expresie Valoarea citită.
n Numărul rândului din fereastră, de la 1.

Ce returnează

Valoarea din rândul n sau NULL.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

CREATE TABLE vanzari (
  agent VARCHAR(20),
  oras VARCHAR(20),
  luna INT,
  suma INT
);

INSERT INTO vanzari VALUES
  ('Ana', 'Iași', 1, 1200), ('Ana', 'Iași', 2, 1500), ('Ana', 'Iași', 3, 900),
  ('Dan', 'Cluj', 1, 900), ('Dan', 'Cluj', 2, 900), ('Dan', 'Cluj', 3, 1700),
  ('Ioana', 'Iași', 1, 2000), ('Ioana', 'Iași', 2, 1100);

Exemplul 1: A doua cea mai mare sumă a fiecărui agent

SELECT DISTINCT agent,
       NTH_VALUE(suma, 2) OVER (PARTITION BY agent ORDER BY suma DESC
         ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS a_doua
FROM vanzari
ORDER BY agent;

Rezultat

+-------+--------+
| agent | a_doua |
+-------+--------+
| Ana   |   1200 |
| Dan   |    900 |
| Ioana |   1100 |
+-------+--------+

Greșeli frecvente

  • Nu definești cadrul complet și primești NULL pe primele rânduri ale fiecărui grup.

Comenzi înrudite

  • FIRST_VALUE(): Prima valoare din fereastră, de exemplu prima lună a fiecărui agent.
  • LAST_VALUE(): Ultima valoare din fereastră; are nevoie de un cadru care să includă toate rândurile.
  • DENSE_RANK(): Clasament cu locuri egale la valori egale, fără „găuri” (1, 2, 2, 3).