Dans l’analyse de données ou la création de rapports avec SQL, il est souvent nécessaire d’extraire la première ou la dernière valeur d’un ensemble de données. Pour faciliter cette tâche, les fonctions FIRST_VALUE et LAST_VALUE sont très utiles. Cet article vous expliquera en détail comment manipuler efficacement vos données à l’aide de ces fonctions avec des exemples concrets.
Utilisation basique de la fonction FIRST_VALUE
La fonction FIRST_VALUE permet d’obtenir la première valeur dans une fenêtre ou une partition spécifique. Cela permet d’extraire facilement la première valeur de la première ligne dans un ensemble de données.
Syntaxe de base
SELECT
column1,
FIRST_VALUE(column1) OVER (PARTITION BY column2 ORDER BY column3) AS first_value
FROM
table_name;
Dans cet exemple, nous obtenons la première valeur de column1
après avoir partitionné les données par column2
et trié par column3
.
Exemple d’utilisation
Par exemple, si vous souhaitez obtenir le nom du premier employé embauché dans chaque département, vous pouvez utiliser la requête suivante :
SELECT
department,
employee_name,
FIRST_VALUE(employee_name) OVER (PARTITION BY department ORDER BY hire_date) AS first_hired
FROM
employees;
Cette requête retourne le nom du premier employé embauché dans chaque département.
Exemples avancés de la fonction FIRST_VALUE
En plus de son utilisation basique, la fonction FIRST_VALUE est utile dans des requêtes plus complexes et pour des analyses avancées. Voici quelques exemples basés sur des jeux de données réels.
Obtenir la première date de vente d’un produit
Si vous souhaitez obtenir la première date de vente d’un produit dans chaque magasin, vous pouvez utiliser la requête suivante :
SELECT
store_id,
product_id,
sale_date,
FIRST_VALUE(sale_date) OVER (PARTITION BY store_id, product_id ORDER BY sale_date) AS first_sale_date
FROM
sales;
Cette requête renvoie la première date de vente de chaque produit dans chaque magasin.
Obtenir la première note d’examen d’un étudiant
Lorsque vous gérez les données des résultats scolaires, vous pouvez obtenir la première note d’examen de chaque étudiant avec cette requête :
SELECT
student_id,
exam_date,
score,
FIRST_VALUE(score) OVER (PARTITION BY student_id ORDER BY exam_date) AS first_exam_score
FROM
exam_results;
Cette requête renvoie la première note d’examen de chaque étudiant.
Obtenir le premier montant d’achat dans les données de transaction
Voici un exemple pour extraire le premier montant d’achat pour chaque client à partir des données de transaction :
SELECT
customer_id,
transaction_date,
amount,
FIRST_VALUE(amount) OVER (PARTITION BY customer_id ORDER BY transaction_date) AS first_purchase_amount
FROM
transactions;
Cette requête renvoie le premier montant d’achat de chaque client.
Utilisation basique de la fonction LAST_VALUE
La fonction LAST_VALUE permet d’obtenir la dernière valeur dans une fenêtre ou une partition spécifique. Cela permet d’extraire facilement la dernière valeur de la dernière ligne dans un ensemble de données.
Syntaxe de base
SELECT
column1,
LAST_VALUE(column1) OVER (PARTITION BY column2 ORDER BY column3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_value
FROM
table_name;
Dans cet exemple, nous obtenons la dernière valeur de column1
après avoir partitionné les données par column2
et trié par column3
. Il est important d’utiliser la clause ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
pour spécifier toute la fenêtre.
Exemple d’utilisation
Par exemple, si vous souhaitez obtenir le nom du dernier employé embauché dans chaque département, vous pouvez utiliser la requête suivante :
SELECT
department,
employee_name,
LAST_VALUE(employee_name) OVER (PARTITION BY department ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_hired
FROM
employees;
Cette requête renvoie le nom du dernier employé embauché dans chaque département.
Exemples avancés de la fonction LAST_VALUE
La fonction LAST_VALUE, comme la fonction FIRST_VALUE, est très utile dans l’analyse des données et la création de rapports. Voici quelques exemples basés sur des jeux de données réels.
Obtenir la dernière date de vente d’un produit
Si vous souhaitez obtenir la dernière date de vente d’un produit dans chaque magasin, vous pouvez utiliser la requête suivante :
SELECT
store_id,
product_id,
sale_date,
LAST_VALUE(sale_date) OVER (PARTITION BY store_id, product_id ORDER BY sale_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_sale_date
FROM
sales;
Cette requête renvoie la dernière date de vente de chaque produit dans chaque magasin.
Obtenir la dernière note d’examen d’un étudiant
Lorsque vous gérez les données des résultats scolaires, vous pouvez obtenir la dernière note d’examen de chaque étudiant avec cette requête :
SELECT
student_id,
exam_date,
score,
LAST_VALUE(score) OVER (PARTITION BY student_id ORDER BY exam_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_exam_score
FROM
exam_results;
Cette requête renvoie la dernière note d’examen de chaque étudiant.
Obtenir le dernier montant d’achat dans les données de transaction
Voici un exemple pour extraire le dernier montant d’achat pour chaque client à partir des données de transaction :
SELECT
customer_id,
transaction_date,
amount,
LAST_VALUE(amount) OVER (PARTITION BY customer_id ORDER BY transaction_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_purchase_amount
FROM
transactions;
Cette requête renvoie le dernier montant d’achat de chaque client.
Combinaison des fonctions FIRST_VALUE et LAST_VALUE
En combinant les fonctions FIRST_VALUE et LAST_VALUE, vous pouvez obtenir simultanément la première et la dernière valeur d’un ensemble de données. Cela permet, par exemple, de comparer les valeurs au début et à la fin d’une période pour une analyse plus approfondie.
Obtenir la première et la dernière date de vente d’un produit
Voici un exemple de requête pour obtenir la première et la dernière date de vente d’un produit dans chaque magasin :
SELECT
store_id,
product_id,
FIRST_VALUE(sale_date) OVER (PARTITION BY store_id, product_id ORDER BY sale_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_sale_date,
LAST_VALUE(sale_date) OVER (PARTITION BY store_id, product_id ORDER BY sale_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_sale_date
FROM
sales;
Cette requête renvoie la première et la dernière date de vente de chaque produit dans chaque magasin.
Obtenir la première et la dernière date d’embauche des employés
Si vous souhaitez obtenir les premières et dernières dates d’embauche des employés de chaque département, vous pouvez utiliser la requête suivante :
SELECT
department,
employee_name,
FIRST_VALUE(hire_date) OVER (PARTITION BY department ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_hire_date,
LAST_VALUE(hire_date) OVER (PARTITION BY department ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_hire_date
FROM
employees;
Cette requête renvoie les noms des employés embauchés en premier et en dernier dans chaque département.
Obtenir le premier et le dernier montant d’achat pour chaque client
Voici une requête pour obtenir le premier et le dernier montant d’achat pour chaque client à partir des données de transaction :
SELECT
customer_id,
FIRST_VALUE(amount) OVER (PARTITION BY customer_id ORDER BY transaction_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_purchase_amount,
LAST_VALUE(amount) OVER (PARTITION BY customer_id ORDER BY transaction_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_purchase_amount
FROM
transactions;
Cette requête renvoie le premier et le dernier montant d’achat de chaque client.
Utilisation des fonctions comme fonctions de fenêtre
Les fonctions FIRST_VALUE et LAST_VALUE peuvent être utilisées comme des fonctions de fenêtre, ce qui permet d’analyser et de manipuler les données de manière plus flexible. En tant que fonctions de fenêtre, elles permettent de calculer les premières et dernières valeurs pour chaque ligne d’un ensemble de résultats.
Concept de base des fonctions de fenêtre
Les fonctions de fenêtre effectuent des calculs sur un ensemble de résultats et les appliquent à un groupe spécifique de lignes dans une fenêtre. La fenêtre est définie par la clause PARTITION BY et ORDER BY.
Syntaxe de base
SELECT
column1,
FIRST_VALUE(column1) OVER (PARTITION BY column2 ORDER BY column3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_value,
LAST_VALUE(column1) OVER (PARTITION BY column2 ORDER BY column3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_value
FROM
table_name;
Dans cette syntaxe, les données sont partitionnées par column2
et triées par column3
pour obtenir les premières et dernières valeurs de column1
.
Exemple d’utilisation : fonction de fenêtre dans les données de vente
Par exemple, si vous souhaitez obtenir la première et la dernière date de vente de chaque magasin, vous pouvez utiliser la requête suivante :
SELECT
store_id,
product_id,
sale_date,
FIRST_VALUE(sale_date) OVER (PARTITION BY store_id ORDER BY sale_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_sale_date,
LAST_VALUE(sale_date) OVER (PARTITION BY store_id ORDER BY sale_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_sale_date
FROM
sales;
Cette requête renvoie les premières et dernières dates de vente pour chaque magasin.
Exemple d’utilisation : données des résultats scolaires
Dans les données des résultats scolaires, si vous souhaitez obtenir les premières et dernières notes d’examen de chaque étudiant, vous pouvez utiliser cette requête :
SELECT
student_id,
exam_date,
score,
FIRST_VALUE(score) OVER (PARTITION BY student_id ORDER BY exam_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_exam_score,
LAST_VALUE(score) OVER (PARTITION BY student_id ORDER BY exam_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_exam_score
FROM
exam_results;
Cette requête renvoie les premières et dernières notes d’examen de chaque étudiant.
Partitionnement et utilisation de ORDER BY
Un des avantages puissants des fonctions FIRST_VALUE et LAST_VALUE est qu’elles permettent de partitionner et de trier les données. Cela permet d’obtenir les premières et dernières valeurs au sein de groupes spécifiques.
Concept de base du partitionnement
Le partitionnement divise les données en groupes basés sur certains critères, permettant des calculs indépendants dans chaque groupe. Le partitionnement se fait via la clause PARTITION BY.
Concept de base de ORDER BY
La clause ORDER BY permet de trier les lignes dans chaque partition dans un ordre spécifique, ce qui permet de déterminer précisément les premières et dernières valeurs.
Exemple d’utilisation du partitionnement et de ORDER BY
Voici une requête pour obtenir les premières et dernières dates de vente de chaque produit dans chaque magasin :
SELECT
store_id,
product_id,
sale_date,
FIRST_VALUE(sale_date) OVER (PARTITION BY store_id, product_id ORDER BY sale_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_sale_date,
LAST_VALUE(sale_date) OVER (PARTITION BY store_id, product_id ORDER BY sale_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_sale_date
FROM
sales;
Cette requête renvoie les premières et dernières dates de vente pour chaque produit dans chaque magasin.
Exemple avancé avec les données des étudiants
Dans les données des résultats scolaires, voici comment obtenir les premières et dernières notes d’examen de chaque étudiant :
SELECT
student_id,
exam_date,
score,
FIRST_VALUE(score) OVER (PARTITION BY student_id ORDER BY exam_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_exam_score,
LAST_VALUE(score) OVER (PARTITION BY student_id ORDER BY exam_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_exam_score
FROM
exam_results;
Cette requête renvoie les premières et dernières notes d’examen de chaque étudiant.
Exemple avancé avec les données de transaction
Voici comment obtenir les premiers et derniers montants d’achat pour chaque client à partir des données de transaction :
SELECT
customer_id,
transaction_date,
amount,
FIRST_VALUE(amount) OVER (PARTITION BY customer_id ORDER BY transaction_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_purchase_amount,
LAST_VALUE(amount) OVER (PARTITION BY customer_id ORDER BY transaction_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_purchase_amount
FROM
transactions;
Cette requête renvoie les premiers et derniers montants d’achat de chaque client.
Exercices et réponses
Pour approfondir votre compréhension des fonctions FIRST_VALUE et LAST_VALUE, nous avons préparé quelques exercices. Chaque exercice est accompagné d’une solution que vous pouvez essayer par vous-même.
Exercice 1 : Obtenir les premières et dernières dates d’embauche pour chaque département
Écrivez une requête pour obtenir les premières et dernières dates d’embauche dans chaque département à partir de la table employees
suivante :
-- Table employees
+---------+------------+------------+
| emp_id | department | hire_date |
+---------+------------+------------+
| 1 | Sales | 2020-01-01 |
| 2 | Sales | 2021-05-10 |
| 3 | HR | 2019-03-15 |
| 4 | HR | 2020-07-23 |
| 5 | IT | 2021-01-05 |
+---------+------------+------------+
Solution
SELECT
department,
FIRST_VALUE(hire_date) OVER (PARTITION BY department ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_hire_date,
LAST_VALUE(hire_date) OVER (PARTITION BY department ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_hire_date
FROM
employees;
Exercice 2 : Obtenir les premières et dernières dates de vente pour chaque produit
Écrivez une requête pour obtenir les premières et dernières dates de vente pour chaque produit à partir de la table sales
suivante :
-- Table sales
+---------+------------+------------+
| sale_id | product_id | sale_date |
+---------+------------+------------+
| 1 | 101 | 2022-01-01 |
| 2 | 102 | 2022-01-05 |
| 3 | 101 | 2022-02-01 |
| 4 | 103 | 2022-01-10 |
| 5 | 102 | 2022-03-01 |
+---------+------------+------------+
Solution
SELECT
product_id,
FIRST_VALUE(sale_date) OVER (PARTITION BY product_id ORDER BY sale_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_sale_date,
LAST_VALUE(sale_date) OVER (PARTITION BY product_id ORDER BY sale_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_sale_date
FROM
sales;
Exercice 3 : Obtenir les premiers et derniers montants d’achat pour chaque client
Écrivez une requête pour obtenir les premiers et derniers montants d’achat pour chaque client à partir de la table transactions
suivante :
-- Table transactions
+-------------+----------+--------+--------------+
| transaction_id | customer_id | amount | transaction_date |
+-------------+----------+--------+--------------+
| 1 | 1001 | 200 | 2023-01-01 |
| 2 | 1002 | 150 | 2023-01-05 |
| 3 | 1001 | 300 | 2023-02-01 |
| 4 | 1003 | 250 | 2023-01-10 |
| 5 | 1002 | 400 | 2023-03-01 |
+-------------+----------+--------+--------------+
Solution
SELECT
customer_id,
FIRST_VALUE(amount) OVER (PARTITION BY customer_id ORDER BY transaction_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_purchase_amount,
LAST_VALUE(amount) OVER (PARTITION BY customer_id ORDER BY transaction_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_purchase_amount
FROM
transactions;
Conclusion
Dans cet article, nous avons appris à utiliser les fonctions SQL FIRST_VALUE et LAST_VALUE pour obtenir les premières et dernières valeurs d’un ensemble de données. Nous avons abordé les utilisations de base, des exemples avancés, l’utilisation des fonctions comme fonctions de fenêtre, et l’importance du partitionnement et de ORDER BY. En maîtrisant ces techniques, vous serez en mesure d’effectuer des analyses de données et de créer des rapports plus efficaces. N’hésitez pas à les appliquer à vos jeux de données réels.