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

Développement SQL Server Discussion :

Obtention des bornes d'une séquence


Sujet :

Développement SQL Server

  1. #1
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    décembre 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2007
    Messages : 349
    Points : 174
    Points
    174
    Par défaut Obtention des bornes d'une séquence
    Bonjour,

    Je vous demande votre aide avisée car je pense que l'opération est assez complexe.

    Je cherche à trouver les bornes min et max d'une sous-séquence.
    Avec les données suivantes:
    Numero CodeGroupe
    070220/001 1
    070220/002 1
    070220/003 1
    070220/004 2
    070220/006 2
    070220/007 3
    070220/008 3
    070220/009 1

    Veuillez noter qu'il n'existe pas de numéro 070220/005

    Je cherche à obtenir, via une procédure stockée qui fait déjà toute la préparation pour obtenir les données de cette table temporaire, le résultat suivant:
    CodeGroupe Num Min Num Max
    1 070220/001 070220/003
    1 070220/009 070220/009
    2 070220/004 070220/004
    2 070220/006 070220/006
    3 070220/007 070220/008

    J'ai déjà essayé l'utilisation du ROW_NUMBER mais je n'obtiens pas le résultat attendu.

    En parcourant le web, je suis tombé sur ceci:
    WITH T
    AS (SELECT ROW_NUMBER() OVER (ORDER BY number) - number AS Grp,
    number
    FROM mytable
    WHERE status = 0)
    SELECT MIN(number) AS [From],
    MAX(number) AS [To]
    FROM T
    GROUP BY Grp
    ORDER BY MIN(number)

    Mais, en l'adaptant à mon cas cela ne peut pas fonctionner puisque le champs number qu'ils utilisent est de type bigint alors que dans mon cas c'est un varchar. Donc le "-Numero" ne fonctionnera pas.
    Ai-je tord?

    Pouvez-vous m'aider?

    Je vous remercie d'avance.

  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
    19 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : mai 2002
    Messages : 19 477
    Points : 46 228
    Points
    46 228
    Par défaut
    Postez le DDL de vos tables et non des tableaux… Indentez vos requêtes !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  3. #3
    Modérateur

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

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 448
    Points : 12 605
    Points
    12 605
    Par défaut
    bonjour,

    La moédalisation serait à revoir, la colonne Numero n'étant pas atomique.

    Essayez ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WITH  Tmp AS (
    	SELECT *, RIGHT(Numero, 3) AS Num, LAG(RIGHT(Numero, 3)) OVER(PARTITION BY CodeGroupe ORDER BY Numero) AS NumPrec
    	FROM mytable
    ), Grp AS (
    	SELECT *, SUM(CASE WHEN NumPrec + 1 = Num THEN 0 ELSE 1 END) OVER(PARTITION BY CodeGroupe ORDER BY Numero) AS Groupe
    	FROM Tmp
    )
    SELECT CodeGroupe, MIN(Numero), MAX(Numero)
    FROM Grp
    GROUP BY CodeGroupe, Groupe
    ORDER BY CodeGroupe

  4. #4
    Membre expert
    Homme Profil pro
    Inscrit en
    septembre 2006
    Messages
    2 687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : septembre 2006
    Messages : 2 687
    Points : 3 793
    Points
    3 793
    Par défaut
    Application habituelle du Tabibitosan :

    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
     
    with data as (
        select '070220/001' as num, 1 as grp from dual 
        union all
        select '070220/002' as num, 1 as grp from dual 
        union all
        select '070220/003' as num, 1 as grp from dual 
        union all
        select '070220/004' as num, 2 as grp from dual 
        union all
        select '070220/006' as num, 2 as grp from dual 
        union all
        select '070220/007' as num, 3 as grp from dual 
        union all
        select '070220/008' as num, 3 as grp from dual 
        union all
        select '070220/009' as num, 1 as grp from dual 
    )
    select * from (
        select distinct grp, code || substr('000' || (min(ord) over (partition by subgrp)),-3) as nummin, 
            code || substr('000' || (max(ord) over(partition by subgrp)),-3) as nummax from (
     
            select code, ord, ord - rn as subgrp, grp
            from (
                select substr(num,1,7) as code, to_number(substr(num,-3)) as ord, grp,
                    row_number() over(partition by grp order by num) as rn
                from data 
            )
        )
    )
    order by grp, nummin 
    ;
     
     
           GRP NUMMIN     NUMMAX    
    ---------- ---------- ----------
             1 070220/001 070220/003
             1 070220/009 070220/009
             2 070220/004 070220/004
             2 070220/006 070220/006
             3 070220/007 070220/008
    (ok je sais : syntaxe ORACLE pour les to_number, to_char, substr et C° mais vraiment pas envie de relancer une VM SQL Server rien que pour cela…)
    (
    et sinon pour les curieux la solution ORACLE avec match_recognize:

    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
     
    with data as (
        select '070220/001' as num, 1 as grp from dual 
        union all
        select '070220/002' as num, 1 as grp from dual 
        union all
        select '070220/003' as num, 1 as grp from dual 
        union all
        select '070220/004' as num, 2 as grp from dual 
        union all
        select '070220/006' as num, 2 as grp from dual 
        union all
        select '070220/007' as num, 3 as grp from dual 
        union all
        select '070220/008' as num, 3 as grp from dual 
        union all
        select '070220/009' as num, 1 as grp from dual 
    )
    select * from data 
    match_recognize (
        partition by grp
        order by num
        measures first(num) as min, last(num) as max
        pattern( STRT A* )
        define 
            A as to_number(substr(num,-3)) - 1 = to_number(substr(prev(num),-3))
    )
    ;
     
           GRP MIN        MAX       
    ---------- ---------- ----------
             1 070220/001 070220/003
             1 070220/009 070220/009
             2 070220/004 070220/004
             2 070220/006 070220/006
             3 070220/007 070220/008

Discussions similaires

  1. [XL-2016] Configuration des bornes d'une ListBox grâce à deux ComboBox
    Par Padawan Pykoda dans le forum Excel
    Réponses: 1
    Dernier message: 10/07/2018, 16h46
  2. [AC-2007] Détection des trous dans une séquence
    Par ARFAOUI1953 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 12/04/2013, 19h47
  3. Intégrale dont l'une des bornes est une variable
    Par clem3900 dans le forum MATLAB
    Réponses: 1
    Dernier message: 20/07/2012, 16h42
  4. Toutes les sous-séquences croissantes et maximales d'une séquence des entiers
    Par hassanJava dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 23/04/2008, 12h19
  5. [TestStand] Propriétés des pas d'une séquence
    Par capblans dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 20/04/2005, 10h57

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