Renvoie la première valeur non nulle d'un flux de données. Utilisez FIRST_VALUE comme fonction de fenêtrage dans une clause OVER, ou comme fonction d'agrégation avec GROUP BY.
Syntaxe
FIRST_VALUE( T value )
FIRST_VALUE( T value, BIGINT order )
Arguments
| Argument | Type de données | Description |
|---|---|---|
value |
Tout type | Colonne ou expression à évaluer. Renvoie NULL si toutes les valeurs d'entrée sont NULL. Tous les arguments doivent être du même type de données. |
order |
BIGINT | Clé numérique déterminant l'enregistrement considéré en premier. La fonction renvoie l'enregistrement non nul dont la valeur order est la plus petite. |
Exemples
Les exemples suivants utilisent la table T1 :
| user_id (VARCHAR) | product_id (BIGINT) | create_time (TIMESTAMP) |
|---|---|---|
| user_001 | 1 | 2023-02-15 10:40:56 |
| user_002 | 2 | 2023-02-15 11:40:56 |
| user_003 | 3 | 2023-02-15 12:40:56 |
| user_001 | 4 | 2023-02-15 13:40:55 |
| user_002 | 5 | 2023-02-15 14:40:56 |
| user_001 | 1 | 2023-02-15 15:40:56 |
| user_003 | 4 | 2023-02-15 16:40:56 |
Trouver le premier produit acheté par chaque utilisateur
Regroupe les lignes par user_id, trie chaque groupe par create_time et renvoie le product_id de la ligne la plus ancienne pour chaque utilisateur.
SELECT `user_id`, create_time, product_id,
FIRST_VALUE(product_id)
OVER (PARTITION BY `user_id` ORDER BY create_time) AS first_product
FROM T1;
Résultat :
| user_id (VARCHAR) | create_time (TIMESTAMP) | product_id (BIGINT) | first_product (BIGINT) |
|---|---|---|---|
| user_001 | 2023-02-15 10:40:56 | 1 | 1 |
| user_001 | 2023-02-15 13:40:56 | 4 | 1 |
| user_001 | 2023-02-15 15:40:56 | 1 | 1 |
| user_002 | 2023-02-15 11:40:56 | 2 | 2 |
| user_002 | 2023-02-15 14:40:56 | 5 | 2 |
| user_003 | 2023-02-15 12:40:56 | 3 | 3 |
| user_003 | 2023-02-15 16:40:56 | 4 | 3 |
Trouver le premier utilisateur ayant acheté chaque produit
Regroupe les lignes par product_id et utilise UNIX_TIMESTAMP(create_time) comme clé de tri pour renvoyer le user_id correspondant au premier achat de chaque produit.
SELECT product_id,
FIRST_VALUE(`user_id`, UNIX_TIMESTAMP(create_time)) AS first_user
FROM T1
GROUP BY product_id;
Résultat :
| product_id | first_user |
|---|---|
| 1 | user_001 |
| 2 | user_002 |
| 3 | user_003 |
| 4 | user_001 |
| 5 | user_002 |