0Pricing
Coding Interview Prep · Leçon

Fenêtres ROWS ou RANGE

Comprendre la différence subtile et très souvent testée entre les fenêtres fondées sur les lignes et celles fondées sur les valeurs

Fenêtres ROWS ou RANGE est une leçon Coding Interview Prep gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Coding Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Coding Interview Prep comprend 4 leçons au total.

La distinction vérifiée par les recruteurs

Une fois que vous savez écrire un total cumulé, la question complémentaire naturelle est : « Quelle est la différence entre ROWS et RANGE dans un cadre de fenêtre ? » C'est un indicateur précis d'un niveau intermédiaire. De nombreux candidats utilisent des cadres au quotidien sans jamais remarquer que ces deux mots-clés se comportent différemment.

Les deux définissent l'ensemble des lignes observées par l'agrégat, mais ils comptent cet ensemble de façons fondamentalement différentes. Maîtrisez cette distinction et vous vous démarquerez.

ROWS compte les lignes physiques

ROWS fonctionne par position. ROWS BETWEEN 2 PRECEDING AND CURRENT ROW signifie littéralement la ligne actuelle plus les deux lignes physiques qui la précèdent directement dans la séquence ordonnée.

Cette clause ne tient pas compte du fait que les lignes voisines partagent ou non la même valeur de ORDER BY. Trois lignes signifient trois lignes, sans exception. C'est le cadre que vous souhaitez presque toujours pour les moyennes glissantes et les totaux cumulés stricts.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
  ) AS rows_sum
FROM sales;

RANGE compte selon la valeur

RANGE fonctionne selon les valeurs. Il inclut toutes les lignes dont la valeur de ORDER BY se situe dans un intervalle logique autour de la valeur de la ligne actuelle, et non selon un nombre de lignes.

La conséquence la plus importante est la suivante : avec RANGE, toutes les lignes ex aequo pour la valeur de ORDER BY sont traitées comme un seul groupe de lignes paires. Elles reçoivent toutes le même cadre et donc le même résultat.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS range_sum
FROM sales;

L'exemple d'égalité qui révèle la différence

Supposons que deux ventes aient eu lieu le 2024-03-02, pour des montants de 30 et 40, après une vente du 2024-03-01 d'un montant de 100.

  • Avec RANGE jusqu'à CURRENT ROW : les deux lignes du 03-02 sont paires, et affichent donc toutes deux 100 + 30 + 40 = 170.
  • Avec ROWS jusqu'à CURRENT ROW : la première ligne du 03-02 affiche 130, la seconde affiche 170, car chaque ligne étend le cadre d'une position supplémentaire.

Mêmes données, nombres différents. Cette divergence en cas d'égalité est au cœur de la question.

Pourquoi la valeur par défaut est RANGE

Rappelons que OVER (ORDER BY ...) sans cadre explicite utilise par défaut RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

Cela signifie qu'un total cumulé naïf utilise silencieusement RANGE. Avec des clés de tri uniques, le résultat est identique à celui de ROWS, et le problème reste donc invisible. Dès que des valeurs de tri en double apparaissent, votre total cumulé regroupe discrètement les lignes ex aequo. C'est pourquoi les ingénieurs expérimentés écrivent explicitement ROWS.

RANGE avec des décalages numériques

RANGE peut prendre un décalage de valeur, et pas seulement UNBOUNDED. RANGE BETWEEN 7 PRECEDING AND CURRENT ROW sur une colonne de date ou numérique inclut chaque ligne dont la valeur se trouve à au plus 7 unités de la valeur actuelle.

Sur une date, cela produit une véritable fenêtre des « 7 derniers jours » qui ignore correctement les jours manquants, alors que ROWS 7 PRECEDING récupère les 7 lignes précédentes quels que soient les intervalles. Connaître cette nuance constitue une réponse solide.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    RANGE BETWEEN INTERVAL '7 days' PRECEDING AND CURRENT ROW
  ) AS last_7_days
FROM sales;

ROWS ignore les lacunes

L’autre aspect à retenir est que ROWS ne tient aucun compte des lacunes dans les données. Si votre table de ventes ne contient pas les week-ends, ROWS BETWEEN 6 PRECEDING AND CURRENT ROW couvre 7 jours enregistrés, ce qui peut en réalité s’étendre sur deux semaines calendaires.

Le choix dépend donc de l’intention : les N derniers enregistrements signifie ROWS ; les N dernières unités de valeur (jours, dollars) signifie RANGE avec un décalage.

Vérification de la prise en charge selon le dialecte

Une réponse honnête en entretien mentionne les différences de prise en charge :

  • PostgreSQL prend en charge RANGE avec des décalages (depuis v11) et ROWS intégralement.
  • serveur SQL prend en charge ROWS et RANGE, mais RANGE uniquement avec UNBOUNDED/CURRENT ROW, et non avec des décalages numériques.
  • MySQL 8 prend en charge les deux, avec des types de décalage RANGE limités.

Si un décalage numérique de RANGE n’est pas disponible, vous pouvez le simuler au moyen d’une jointure de la table avec elle-même ou d’un calendrier généré. Le mentionner montre que vous êtes conscient des contraintes de production.

GROUPS : le troisième mode

Il existe un troisième mode de définition de fenêtre, moins connu : GROUPS. Il compte les groupes de lignes ex æquo plutôt que les lignes ou les valeurs. GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW inclut le groupe de lignes ex æquo actuel et celui qui le précède.

Il est rarement nécessaire, mais le citer si l’on vous demande « existe-t-il d’autres modes de cadre ? » démontre une réelle maîtrise du sujet. Il est pris en charge par PostgreSQL 11+ et quelques autres systèmes.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
  ) AS two_day_groups
FROM sales;

Une règle de décision à réciter

Résumez tout le sujet en une phrase que vous pouvez prononcer en entretien :

« Utilisez ROWS lorsque vous voulez dire un nombre fixe de lignes physiques, utilisez RANGE lorsque vous voulez dire une étendue logique de la valeur de tri, et souvenez-vous que les égalités les font diverger, car la fenêtre RANGE par défaut regroupe les valeurs égales. »

Cette seule phrase répond entièrement et avec assurance à la question.

Comparaison côte à côte

Placer les deux définitions de fenêtre dans une même requête rend la divergence visible. Exécutez-la sur des données comportant des dates en double et comparez les deux colonnes ligne par ligne.

Sur des dates uniques, les colonnes correspondent exactement ; sur des dates à égalité, la colonne RANGE répète le même total pour les lignes ex æquo, tandis que la colonne ROWS augmente d’un cran à chaque ligne.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (ORDER BY sale_date
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS rows_total,
  SUM(amount) OVER (ORDER BY sale_date
    RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS range_total
FROM sales;

Vérification rapide

Deux lignes ont la même valeur pour ORDER BY avec un cadre par défaut. Que se passe-t-il ?

Récapitulatif : ROWS et RANGE

ROWS compte les lignes physiques ; RANGE compte selon la valeur logique de la colonne de tri et regroupe les valeurs à égalité comme des lignes ex æquo. Le cadre par défaut OVER (ORDER BY ...) est RANGE, ce qui explique pourquoi un total cumulatif naïf peut regrouper les valeurs de tri en double.

Choisissez ROWS pour « les N derniers enregistrements » et les fenêtres mobiles insensibles aux lacunes ; choisissez RANGE avec un décalage pour « les N derniers jours/dollars » lorsque les lacunes doivent être respectées. Savoir que GROUPS existe est un atout. Nous allons maintenant appliquer le cadre ROWS pour construire des moyennes mobiles.

Questions Fréquemment Posées

La leçon « Fenêtres ROWS ou RANGE » est-elle gratuite ?

Oui — le texte complet de « Fenêtres ROWS ou RANGE » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Coding Interview Prep, passe à CoddyKit PRO. Le cours Coding Interview Prep comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Fenêtres ROWS ou RANGE » ?

Comprendre la différence subtile et très souvent testée entre les fenêtres fondées sur les lignes et celles fondées sur les valeurs Tu pratiques Coding Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Coding Interview Prep ?

Aucune expérience préalable n'est requise. Coding Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Fenêtres ROWS ou RANGE » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Coding Interview Prep ?

Oui. Chaque leçon Coding Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Sommes cumulées avec les fenêtres
  2. Fenêtres ROWS ou RANGE
  3. Moyennes mobiles sur une fenêtre glissante
  4. Distribution cumulée et pourcentage du total
← Retour à Coding Interview Prep