Cet article explore les fonctions de fenêtre SQL, classées comme fonctions de classement, d'agrégat et de valeur. Il détaille leur utilisation dans le calcul des totaux de course et discute des implications de performance et de la compatibilité avec divers types de jointures. Le principal focal
Les fonctions de fenêtre dans SQL étendent les capacités des fonctions d'agrégats standard en permettant aux calculs sur un ensemble de lignes de table liées à la ligne actuelle. Ils ne regroupent pas les lignes dans un ensemble de résultats plus petit comme GROUP BY
DOS; Au lieu de cela, ils opèrent sur une "fenêtre" de lignes définies par une PARTITION BY
la clause ORDER BY
. Il y a trois catégories principales:
ORDER BY
. Les exemples incluent RANK()
, ROW_NUMBER()
, DENSE_RANK()
, NTILE()
. RANK()
peut attribuer le même rang à plusieurs lignes s'ils ont la même valeur dans la colonne de commande, tandis que ROW_NUMBER()
attribue un rang unique à chaque ligne, même s'ils sont liés. DENSE_RANK()
attribue des rangs consécutifs sans lacunes, en sautant les rangs qui auraient été affectés aux liens. NTILE()
divise les lignes en un nombre spécifié de groupes.SUM
, AVG
, MIN
, MAX
, COUNT
) à travers la fenêtre des lignes. La principale différence par rapport aux fonctions d'agrégats standard est qu'ils renvoient une valeur pour chaque ligne dans l'ensemble de résultats, pas une seule valeur agrégée pour chaque groupe. Par exemple, SUM() OVER (PARTITION BY department ORDER BY salary)
calculerait la somme cumulative des salaires de chaque département, commandée par salaire.LAG()
et LEAD()
sont des exemples courants, récupérant les valeurs des lignes précédant ou succédant respectivement à la ligne actuelle respectivement. FIRST_VALUE()
et LAST_VALUE()
récupérer les premières et dernières valeurs dans la fenêtre. Ceux-ci sont utiles pour comparer la valeur d'une ligne à ses voisins ou trouver des informations contextuelles. Les totaux de course, également appelés sommes cumulatives, sont facilement calculées à l'aide des fonctions de fenêtre. Le composant central est la fonction de fenêtre d'agrégation SUM()
combinée à une clause ORDER BY
approprié.
Disons que nous avons un tableau appelé sales
avec les colonnes date
et amount
. Pour calculer le total des ventes de fonctionnement pour chaque jour:
<code class="sql">SELECT date, amount, SUM(amount) OVER (ORDER BY date) as running_total FROM sales;</code>
Cette requête commande les ventes par date, puis, pour chaque ligne, SUM(amount) OVER (ORDER BY date)
calcule la somme du amount
pour toutes les lignes jusqu'à et y compris la ligne actuelle.
Si vous souhaitez calculer les totaux de course partitionnés par une catégorie spécifique (par exemple, catégorie de produit), vous ajouteriez une PARTITION BY
clause:
<code class="sql">SELECT product_category, date, amount, SUM(amount) OVER (PARTITION BY product_category ORDER BY date) as running_total_by_category FROM sales;</code>
Cela fournira un total d'exécution distinct pour chaque product_category
.
Bien que les fonctions de fenêtre soient puissantes, elles peuvent avoir un impact sur les performances de la requête, en particulier dans les requêtes complexes ou sur de grands ensembles de données. Les implications de performance dépendent de plusieurs facteurs:
PARTITION BY
et ORDER BY
les clauses, en particulier celles impliquant plusieurs colonnes ou colonnes non indexées, peuvent augmenter considérablement le temps de traitement. Une indexation efficace est cruciale pour les performances.Pour atténuer les problèmes de performance:
PARTITION BY
et ORDER BY
les clauses sont essentiels.PARTITION BY
et ORDER BY
les clauses aussi simple que possible.Oui, les fonctions de fenêtre peuvent être utilisées avec différents types de jointures, mais la définition de la fenêtre doit être soigneusement considérée. La fenêtre est définie après l'opération de jointure.
Par exemple, si vous avez deux tables, orders
et customers
, rejoints sur customer_id
, vous pouvez utiliser une fonction de fenêtre pour calculer la valeur de commande totale pour chaque client:
<code class="sql">SELECT o.order_id, c.customer_name, o.order_value, SUM(o.order_value) OVER (PARTITION BY c.customer_id) as total_customer_value FROM orders o JOIN customers c ON o.customer_id = c.customer_id;</code>
Ici, la SUM(o.order_value) OVER (PARTITION BY c.customer_id)
calcule la somme des valeurs de commande pour chaque client après que l'opération JOIN
a combiné les données des deux tableaux. La clause PARTITION BY
garantit que la somme est calculée séparément pour chaque client. Le même principe s'applique aux autres types de jointures (jointure gauche, jointure droite, jointure extérieure complète). La clé est que la fonction de fenêtre fonctionne sur l'ensemble de résultats produit par la jointure.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!