FIRST_VALUE() în MySQL

Prima valoare din fereastră, de exemplu prima lună a fiecărui agent.

Sintaxă
FIRST_VALUE(expresie) OVER ([PARTITION BY ...] ORDER BY ... [cadru])

Ce face FIRST_VALUE()

FIRST_VALUE() returnează valoarea din primul rând al ferestrei, în ordinea din ORDER BY. Este util pentru comparații cu punctul de pornire.

Parametri

Parametru Descriere
expresie Valoarea citită din primul rând.

Ce returnează

Valoarea din primul rând al ferestrei.

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: Evoluția față de prima lună

SELECT agent, luna, suma,
       FIRST_VALUE(suma) OVER (PARTITION BY agent ORDER BY luna) AS prima_luna,
       suma - FIRST_VALUE(suma) OVER (PARTITION BY agent ORDER BY luna) AS fata_de_start
FROM vanzari
ORDER BY agent, luna;

Rezultat

+-------+------+------+------------+---------------+
| agent | luna | suma | prima_luna | fata_de_start |
+-------+------+------+------------+---------------+
| Ana   |    1 | 1200 |       1200 |             0 |
| Ana   |    2 | 1500 |       1200 |           300 |
| Ana   |    3 |  900 |       1200 |          -300 |
| Dan   |    1 |  900 |        900 |             0 |
| Dan   |    2 |  900 |        900 |             0 |
| Dan   |    3 | 1700 |        900 |           800 |
| Ioana |    1 | 2000 |       2000 |             0 |
| Ioana |    2 | 1100 |       2000 |          -900 |
+-------+------+------+------------+---------------+

Greșeli frecvente

  • Folosești FIRST_VALUE() fără ORDER BY în OVER. Ordinea rândurilor nu este garantată, deci „primul” poate fi oricare.

Comenzi înrudite

  • LAST_VALUE(): Ultima valoare din fereastră; are nevoie de un cadru care să includă toate rândurile.
  • NTH_VALUE(): Valoarea din al N-lea rând al ferestrei (ex. a doua cea mai mare vânzare).
  • LAG(): Valoarea din rândul anterior (sau cu N rânduri înainte), ca să compari cu perioada trecută.