Utilisation détaillée de la fonction de fenêtre OVER (PARTITION BY) - syntaxe + fonction + plage de fenêtre ROWS et RANGE

Table des matières

1. Ecriture de fonction

2. La plage de fenêtres de la fenêtre ROWS et RANGE

1. Utilisation délimitée

2. La différence entre ROWS et RANGE

(1) ROWS est limité par le nombre de lignes

(2) RANGE est limité par la plage de données

        commander par numéro

                Exemple 1 La plage de données récapitulative est : [valeur de la ligne actuelle, valeur de la ligne actuelle+3]

                Exemple 2 La plage de données récapitulative est : [valeur de ligne actuelle-3, valeur de ligne actuelle]

        trier par heure

                Exemple 1 [date de la ligne actuelle, date de la ligne actuelle+2]

                Exemple 2 [date de la ligne actuelle-2, date de la ligne actuelle]

3. Présentation de la fonction

1. Fonction de tri

2. Fonction d'agrégation

3. Fonction de comparaison

        Exemple 1 le décalage de décalage est un décalage négatif=-1

        Exemple 2 lag récupère la 0ème ligne en avant, c'est-à-dire que le décalage est de 0

        Exemple 3 lag supprime la 2e rangée vers l'avant, c'est-à-dire que le décalage est de 2

        Exemple 4 Modifier le champ, le décalage supprime la deuxième ligne vers l'avant, c'est-à-dire que le décalage vers l'avant est de 2

        L'avance de l'exemple 5 retire la deuxième ligne vers l'arrière, c'est-à-dire qu'elle se décale vers l'arrière de 2

        L'avance de l'exemple 6 supprime la deuxième ligne vers l'arrière, c'est-à-dire décale vers l'arrière de 2, sans ajouter la valeur par défaut


1. Ecriture de fonction

Nom de la fonction (paramètre) OVER (clause PARTITION BY clause ORDER BY clause ROWS/RANGE)

Il se compose de trois parties :
nom de la fonction : fonctions d'agrégation telles que sum, max, min, count, avg, etc., et fonctions de comparaison de lignes telles que lead et lag ; over
 : mot-clé, indiquant que la fonction précédente est une fonction analytique, pas une fonction d'agrégation ordinaire
Clause de regroupement : le contenu de l'enregistrement après le mot-clé over ;

La clause d'analyse est composée des trois parties suivantes :
PARTITION BY : clause de regroupement, indiquant la plage de calcul de la fonction d'analyse, et les différents groupes ne sont pas pertinents les uns par rapport aux autres ;
ORDER BY : clause de tri, indiquant la méthode de tri au sein du groupe après regroupement ;
ROWS/ RANGE : La clause window est le sous-groupe (également appelé window) au sein du groupe après le regroupement (PARTITION BY), à ce moment, la fenêtre de plage de calcul de la fonction d'analyse n'est pas PARTITON. Il existe deux types de fenêtres, ROWS et RANGE ;

2. La plage de fenêtres de la fenêtre ROWS et RANGE

1. Utilisation délimitée

  • LIGNE ACTUELLE : ligne actuelle
  • UNBOUNDED : Non lié, illimité
  • UNBOUNDED PRECEDING : la première ligne de l'intervalle
  • UNBOUNDED FOLLOWING : la dernière ligne de l'intervalle
  • UNBOUNDED PRECEDING AND UNBOUNES FOLLOWING : pour les enregistrements précédents et suivants de tous les enregistrements actuels, tous les enregistrements du groupe
  • PRECEDING: Before..., N PRECEDING: N lignes avant la ligne actuelle, qui peut être un nombre utilisé pour limiter la plage de données RANGE, ou une expression qui peut calculer un nombre
  • SUIVANT : après..., N SUIVANT : N lignes après la ligne actuelle, qui peut être un nombre utilisé pour limiter la plage de données RANGE, ou une expression permettant de calculer un nombre
  • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW : fait référence aux données de la première ligne à la ligne actuelle
  • ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING : fait référence au résumé de la ligne actuelle à la dernière ligne
  • LIGNES ENTRE 1 LIGNE PRÉCÉDENTE ET LIGNE ACTUELLE : fait référence aux données de la ligne précédente (ROWNUM-1) à la ligne actuelle de la ligne actuelle
  • LIGNES ENTRE 1 PRECEDING ET 1 FOLLOWING : fait référence aux données de la ligne précédente (ROWNUM-1) à la ligne suivante (ROWNUM+1) de la ligne actuelle
  • RANGE BETWEEN CURRENT ROW AND 350 FOLLOWING : fait référence aux données comprises dans la plage allant de la ligne actuelle aux données de la ligne actuelle + 350
  • RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING : Fait référence aux données comprises dans la plage après que la plage de données de la ligne actuelle est moins 5 plus 5

2. La différence entre ROWS et RANGE

ROWS est limité par le nombre de lignes

RANGE est limité par la plage de données

(1) ROWS est limité par le nombre de lignes

Structure du tableau et données de test :

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `video_id` int(0) NOT NULL COMMENT '视频ID',
  `dt` date NULL DEFAULT NULL,
  `if_follow` tinyint(0) NULL DEFAULT NULL COMMENT '是否关注'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (2001, '2021-09-24', 1);
INSERT INTO `test` VALUES (2001, '2021-10-03', 1);
INSERT INTO `test` VALUES (2001, '2021-10-02', 1);
INSERT INTO `test` VALUES (2001, '2021-10-01', 1);
INSERT INTO `test` VALUES (2002, '2021-09-25', 1);
INSERT INTO `test` VALUES (2002, '2021-09-25', 1);
INSERT INTO `test` VALUES (2002, '2021-09-26', 1);
INSERT INTO `test` VALUES (2002, '2021-09-27', 1);
INSERT INTO `test` VALUES (2002, '2021-09-28', 1);
INSERT INTO `test` VALUES (2002, '2021-09-29', 1);
INSERT INTO `test` VALUES (2002, '2021-09-30', 1);
INSERT INTO `test` VALUES (2002, '2021-10-01', 1);
INSERT INTO `test` VALUES (2002, '2021-10-02', 1);
INSERT INTO `test` VALUES (2002, '2021-10-03', 1);

déclaration:

select video_id,dt, sum(if_follow) over(partition by video_id order by dt rows BETWEEN CURRENT ROW and 1 following ) from test ;

(2) RANGE est limité par la plage de données

Structure du tableau et données de test :

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `video_id` int(0) NOT NULL COMMENT '视频ID',
  `dt` date NULL DEFAULT NULL,
  `if_follow` tinyint(0) NULL DEFAULT NULL COMMENT '是否关注'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (2001, '2021-09-24', 1);
INSERT INTO `test` VALUES (2001, '2021-10-03', 9);
INSERT INTO `test` VALUES (2001, '2021-10-02', 2);
INSERT INTO `test` VALUES (2001, '2021-10-01', 6);
INSERT INTO `test` VALUES (2002, '2021-09-25', 1);
INSERT INTO `test` VALUES (2002, '2021-09-25', 1);
INSERT INTO `test` VALUES (2002, '2021-09-26', 6);
INSERT INTO `test` VALUES (2002, '2021-09-27', 1);
INSERT INTO `test` VALUES (2002, '2021-09-28', 1);
INSERT INTO `test` VALUES (2002, '2021-09-29', 8);
INSERT INTO `test` VALUES (2002, '2021-09-30', 7);
INSERT INTO `test` VALUES (2002, '2021-10-01', 1);
INSERT INTO `test` VALUES (2002, '2021-10-02', 9);
INSERT INTO `test` VALUES (2002, '2021-10-03', 1);

L'instruction suivante signalera une erreur, car lorsque RANGE et PRECEDING/FOLLOWING sont utilisés ensemble, l'expression de order by doit être un nombre ou une différence de temps

select video_id,dt, sum(if_follow) over(partition by video_id order by dt range BETWEEN 3 preceding and CURRENT ROW ) from test ;

 报错内容如下:
select video_id,dt, sum(if_follow) over(partition by video_id order by dt range BETWEEN 3 previous and CURRENT ROW ) from test >
3587 - Window '<unnamed window>' with RANGE N PRECEDING/FOLLOWING frame requiert exactement une expression ORDER BY, de type numérique ou temporel

commander par numéro

Exemple 1 La plage de données récapitulative est : [valeur de la ligne actuelle, valeur de la ligne actuelle+3]

select video_id,dt, sum(if_follow) over(partition by video_id order by if_follow range BETWEEN  CURRENT ROW and  3 following) from test ;

Exemple 2 La plage de données récapitulative est : [valeur de ligne actuelle-3, valeur de ligne actuelle]

select video_id,dt, sum(if_follow) over(partition by video_id order by if_follow range BETWEEN 3 PRECEDING and CURRENT ROW ) from test ;

trier par heure

Lorsque le type de l'expression trier par est heure (date, dateheure), Interval doit être utilisé

Exemple 1 [date de la ligne actuelle, date de la ligne actuelle+2]

select video_id,dt, sum(if_follow) over(partition by video_id order by dt range BETWEEN  CURRENT ROW and  interval 2 day following) from test ;

Exemple 2 [date de la ligne actuelle-2, date de la ligne actuelle]

select video_id,dt, sum(if_follow) over(partition by video_id order by dt range BETWEEN interval 2 day PRECEDING and CURRENT ROW ) from test ;

3. Présentation de la fonction

Les éléments suivants sont disponibles dans mysql

1. Fonction de tri

La fonction rank(), s'il y a égalité, occupera la position suivante. Par exemple, si trois étudiants avec un score de 100 sont à égalité pour la première place, alors l'étudiant avec un score de 99 est la deuxième place. la fonction rank(), le classement est : 1,1,1,4 ; la fonction
dense() , s'il y a une situation parallèle, elle n'occupera pas le nom suivant, comme dans l'exemple précédent, le classement est : 1 ,1,1,2; fonction
row_number() , ignorera En cas d'égalité, en utilisant l'exemple ci-dessus, les classements sont : 1,2,3,4;

2. Fonction d'agrégation

count() over(partition by ... order by ...) : trouver le nombre total après le regroupement ;
max() over(partition by ... order by ...) : trouver la valeur maximale après le regroupement ;
min( ) over(partition by ... order by ...) : recherche la valeur minimale après regroupement ;
avg() over(partition by ... order by ...) : recherche la valeur moyenne après regroupement ;

3. Fonction de comparaison

lag() over(partition by ... order by ...) : supprime la nième ligne de données vers l'avant.  
lead() over(partition by ... order by ...): supprime la nième ligne de données en arrière.

lag (arg1, arg2, arg3), lead (arg1, arg2, arg3)
le premier paramètre est le nom de la colonne,
le deuxième paramètre est le décalage offset, qui ne peut pas être négatif, et
le troisième paramètre est la valeur par défaut lorsque la fenêtre d'enregistrement est valeur dépassée.

Structure du tableau et données de test :

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `video_id` int(0) NOT NULL COMMENT '视频ID',
  `dt` date NULL DEFAULT NULL,
  `if_follow` tinyint(0) NULL DEFAULT NULL COMMENT '是否关注'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (2001, '2021-09-24', 1);
INSERT INTO `test` VALUES (2001, '2021-10-03', 9);
INSERT INTO `test` VALUES (2001, '2021-10-02', 2);
INSERT INTO `test` VALUES (2001, '2021-10-01', 6);
INSERT INTO `test` VALUES (2002, '2021-09-25', 1);
INSERT INTO `test` VALUES (2002, '2021-09-25', 1);
INSERT INTO `test` VALUES (2002, '2021-09-26', 6);
INSERT INTO `test` VALUES (2002, '2021-09-27', 1);
INSERT INTO `test` VALUES (2002, '2021-09-28', 1);
INSERT INTO `test` VALUES (2002, '2021-09-29', 8);
INSERT INTO `test` VALUES (2002, '2021-09-30', 7);
INSERT INTO `test` VALUES (2002, '2021-10-01', 1);
INSERT INTO `test` VALUES (2002, '2021-10-02', 9);
INSERT INTO `test` VALUES (2002, '2021-10-03', 1);

Exemple 1 le décalage de décalage est un décalage négatif=-1

Erreur de syntaxe, décalage, ne peut pas être négatif

select video_id,dt, lag(dt,-1,'偏移超出了') over(order by dt ) from test ;

 1064 - Vous avez une erreur dans votre syntaxe SQL ; consultez le manuel qui correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près de '-1,'偏移超出了') over(order by dt ) from test' à la ligne 1 

Exemple 2 lag récupère la 0ème ligne en avant, c'est-à-dire que le décalage est de 0

select video_id,dt, lag(dt,0,'偏移超出了') over(order by dt ) from test ;

 

Exemple 3 lag supprime la 2e rangée vers l'avant, c'est-à-dire que le décalage est de 2

select video_id,dt, lag(dt,2,'偏移超出了') over(order by dt ) from test ;

 

Exemple 4 Modifier le champ, le décalage supprime la deuxième ligne vers l'avant, c'est-à-dire que le décalage vers l'avant est de 2

select video_id,dt, lag(video_id,2,'偏移超出了') over(order by dt ) from test ;

L'avance de l'exemple 5 retire la deuxième ligne vers l'arrière, c'est-à-dire qu'elle se décale vers l'arrière de 2

select video_id,dt, lead(video_id,2,'偏移超出了') over(order by dt ) from test ;

L'avance de l'exemple 6 supprime la deuxième ligne vers l'arrière, c'est-à-dire décale vers l'arrière de 2, sans ajouter la valeur par défaut

select video_id,dt, lead(video_id,2) over(order by dt ) from test ;

Les éléments suivants peuvent être des fonctions Oracle, mais mysql n'a pas réussi à les utiliser :

first_value()  over() et last_value()  over() sont respectivement la première et la dernière du groupe

ratio_to_report() over(partition by ... order by ...): ratio_to_report() est le numérateur entre parenthèses, et over() est le dénominateur entre parenthèses

percent_rank() sur(partitionner par ... trier par ...)

おすすめ

転載: blog.csdn.net/Ahuuua/article/details/127136611