IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Rechercher semaine min et max sur periode glissante


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Ingenieur developpement
    Inscrit en
    Septembre 2002
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingenieur developpement

    Informations forums :
    Inscription : Septembre 2002
    Messages : 175
    Points : 106
    Points
    106
    Par défaut Rechercher semaine min et max sur periode glissante
    Bonjour,

    J'aimerai retrouver dans une requete SQL ma semaine min et ma semaine max sur une période pouvant chevaucher une année.

    J'ai une table qui contient un N_IdCycleV et un N_NoSemaine. mon CycleV ne peut être valide que sur des semaines consécutives. il n'y a pas plusieurs période pour un cycleV

    Un CycleV peut être valide sur une période dans l'année (ex: De la semaine 4 à 7)

    N_IdCycleV N_NoSemaine
    10 4
    10 5
    10 6
    10 7

    mais un cyclev peut être valide sur la période de fin d'année, début d'année nouvelle (ex: De la semaine 50 à la semaine 3)

    N_IdCycleV N_NoSemaine
    11 50
    11 51
    11 52
    11 53
    11 1
    11 2
    11 3

    Dans une requête, je voudrais recupérer le min de la période et le max pour chaque CycleV

    N_IDCYCLEV MinPeriode MaxPeriode
    10 4 7
    11 50 3

    Toute proposition et réflexion est la bienvenue

    La première réflexion est que si le min = 1 et max = 53 (et count <> 53) alors il y a chevauchement sinon on prend le min et max. Par contre, s'il y a chevauchement, comment récupérer les extrémités min et max?

    Merci de votre aide

    NB: Je suis sous FireBird

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 899
    Points : 53 140
    Points
    53 140
    Billets dans le blog
    6
    Par défaut
    Il suffit d'utiliser les fonctions de fenêtrage MAX/MIN() OVER(PARTITION BY...). À lire : http://sqlpro.developpez.com/article...clause-window/
    SI vous voulez plus d'aide, postez le DDL de vos tables ainsi qu'un jeu d'essais sous forme SQL INSERT. À lire : http://www.developpez.net/forums/a69...gage-sql-lire/

    A +

  3. #3
    Membre régulier
    Profil pro
    Ingenieur developpement
    Inscrit en
    Septembre 2002
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingenieur developpement

    Informations forums :
    Inscription : Septembre 2002
    Messages : 175
    Points : 106
    Points
    106
    Par défaut
    bonjour Frédéric et merci de ta réponse.

    J'ai déjà lu ta page sur les requêtes fenêtrées qui m'a été utile pour un autre cas mais je ne vois pas l'utilisation dans celui-ci. Dans le cas d'un chevauchement, ce n'est pas le min et max qui me donnerai mes valeurs mais plutôt le numero de semaine dont le numero suivant n'existe pas pour le max et le numero précédent n'existe pas pour le min.

    voici le DDL simplifié de mes tables ainsi que des données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE TABLE CYCLEV (
        N_IDCYCLEV               INTEGER NOT NULL ,
        S_LBLCYCLEV              VARCHAR(200) ,
        N_NIVHIERARCHVG          NUMERIC(8,0),
        N_IDVG                   INTEGER ,
        CONSTRAINT PK_CYCLEV PRIMARY KEY (N_IDCYCLEV)
    );
     
    CREATE TABLE TR_SEMAINEDEBCULT (
        N_IDCYCLEV                INTEGER NOT NULL,
        N_NOSEMAINE               NUMERIC(8,0) NOT NULL,
        CONSTRAINT PK_TR_SEMAINEDEBCULT PRIMARY KEY (N_IDCYCLEV, N_NOSEMAINE)
    );
     
    ALTER TABLE TR_SEMAINEDEBCULT ADD CONSTRAINT FK_TR_SEMAI_TR_SEMAIN_CYCLEV2 FOREIGN KEY (N_IDCYCLEV) REFERENCES CYCLEV (N_IDCYCLEV) ON DELETE CASCADE;
    insertion des données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    INSERT INTO CYCLEV (N_IDCYCLEV, S_LBLCYCLEV, N_NIVHIERARCHVG, N_IDVG) VALUES (2, 'jeune plant PENSEE plaque 240 sem 47-5 SEV', 1, 1);
    INSERT INTO CYCLEV (N_IDCYCLEV, S_LBLCYCLEV, N_NIVHIERARCHVG, N_IDVG) VALUES (3, 'jeune plant PAQUERETTE plaque 240 sem 40-3 SEV', 1, 4);
    INSERT INTO CYCLEV (N_IDCYCLEV, S_LBLCYCLEV, N_NIVHIERARCHVG, N_IDVG) VALUES (7, 'jeune plant CINERAIRE MARITIME plaque 240 sem 47-5 SEV', 1, 2);
    INSERT INTO CYCLEV (N_IDCYCLEV, S_LBLCYCLEV, N_NIVHIERARCHVG, N_IDVG) VALUES (9, 'jeune plant PENSEE plaque 240 sem 23-31 SEV', 1, 1);
     
     
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (1, 47);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (1, 48);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (1, 49);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (1, 50);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (1, 51);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (1, 52);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (1, 53);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (1, 1;
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (1, 2);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (1, 3);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (1, 4);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (1, 5);
     
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 40);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 41);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 42);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 43);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 44);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 45);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 46);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 47);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 48);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 49);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 50);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 51);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 52);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 53);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 1);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 2);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (2, 3);
     
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (7, 47);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (7, 48);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (7, 49);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (7, 50);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (7, 51);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (7, 52);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (7, 53);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (7, 1);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (7, 2);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (7, 3);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (7, 4);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (7, 5);
     
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (9, 23);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (9, 24);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (9, 25);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (9, 26);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (9, 27);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (9, 28);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (9, 29);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (9, 30);
    INSERT INTO TR_SEMAINEDEBCULT (N_IDCYCLEV, N_NOSEMAINE) VALUES (9, 31);

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    Bonsoir,

    J'aurais tendance à dire qu'il manque l'année dans tes numéros de semaines...

    En effet je ne vois pas comment les fonctions MIN/MAX peuvent un coup considérer 4 comme MIN pour le cas semaines 4-8 et comme MAX pour le cas semaines 52-4.

    Par contre avec 201352-201404 et 201304-201308 il n'y a pas de problème.

    devYan

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Ceci peut être un bon début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    SELECT 
    		T1.N_IDCYCLEV
    		,MAX(CASE WHEN T2.N_IDCYCLEV IS NULL THEN T1.N_NOSEMAINE END) AS Mini
    		,MIN(CASE WHEN T3.N_IDCYCLEV IS NULL THEN T1.N_NOSEMAINE END) AS Maxi
    FROM		TR_SEMAINEDEBCULT T1
    LEFT JOIN	TR_SEMAINEDEBCULT T2
    	ON			T2.N_IDCYCLEV = T1.N_IDCYCLEV
    	AND			T2.N_NOSEMAINE = T1.N_NOSEMAINE - 1
    LEFT JOIN	TR_SEMAINEDEBCULT T3
    	ON			T3.N_IDCYCLEV = T1.N_IDCYCLEV
    	AND			T3.N_NOSEMAINE = T1.N_NOSEMAINE + 1
    WHERE		T2.N_IDCYCLEV IS NULL
    	OR		T3.N_IDCYCLEV IS NULL
    GROUP BY T1.N_IDCYCLEV
    En fonction de vos données et de vos index, d'autres écritures reprenant le même principe pourraient donner de meilleures performances.

  6. #6
    Membre régulier
    Profil pro
    Ingenieur developpement
    Inscrit en
    Septembre 2002
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingenieur developpement

    Informations forums :
    Inscription : Septembre 2002
    Messages : 175
    Points : 106
    Points
    106
    Par défaut
    Merci aieeeuuuuu,

    Ta requête correspond exactement au résultat recherché et le temps d'exécution est très bon.

    Je vais passer en résolu.

    Encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requête min et max sur tranche horaire
    Par PhilLU dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/08/2013, 14h17
  2. Min et Max sur une periode calculée
    Par Alex3030 dans le forum Requêtes
    Réponses: 2
    Dernier message: 19/06/2013, 07h08
  3. [AC-2007] Optimisation calcul sur periode glissante
    Par LouisT dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 08/02/2013, 18h08
  4. Recherche un min et max et valeur abérrante
    Par Invité dans le forum Excel
    Réponses: 2
    Dernier message: 29/12/2012, 16h09
  5. Recherche de Min et Max en théorie, mais en pratique ?
    Par dasycarpum dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 01/01/2012, 18h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo