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

Adaptive Server Enterprise Sybase Discussion :

min max par plages


Sujet :

Adaptive Server Enterprise Sybase

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut min max par plages
    bonjour à tous
    J'ai une table qui a le contenu suivant :

    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
     
     
    AdmID            dateTime                              optionID
    1                   10.10.2009 08:03:23                 x
    1                   10.10.2009 08:03:53                 x
    1                   10.10.2009 08:04:20                 x
    1                   10.10.2009 08:05:13                 y
    1                   10.10.2009 08:05:53                 y
    1                   10.10.2009 08:06:33                 y
    1                   10.10.2009 08:06:53                 x
    1                   10.10.2009 08:07:53                 x
    1                   10.10.2009 08:08:33                 y
    1                   10.10.2009 08:09:13                 z
    1                   10.10.2009 08:10:23                 z
    2                   11.10.2009 08:03:23                 x
    2                   11.10.2009 08:03:53                 x
    2                   11.10.2009 08:04:20                 x
    2                   11.10.2009 08:05:13                 y
    2                   11.10.2009 08:05:53                 y
    2                   11.10.2009 08:06:33                 y
    2                   11.10.2009 08:06:53                 x
    2                   11.10.2009 08:07:53                 x
    2                   11.10.2009 08:08:33                 y
    2                   11.10.2009 08:09:13                 z
    2                   11.10.2009 08:10:23                 z
    .
    .
    .
    J'essaie de faire une requête qui va me ramener pour chaque AdmID, les dates de début(min) et de fin(max) des plages ou Optionid = x
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AdmID         min                                              max 
    1                10.10.2009 08:03:23                   10.10.2009 08:04:20
    1                10.10.2009 08:06:53                   10.10.2009 08:07:53
    J'ai essayé avec quelques requête mais j'arrive à avoir juste le min et max pour otpionid=x sur toutes les lignes ...mais pas par plages
    Est-ce possible par sql ou procédure stockée ?

    merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    C'est faisable "relativement facilement" si votre SGBD supporte les fonctions de fenêtrage.

    => quel est votre SGBD ?

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Waldar Voir le message
    C'est faisable "relativement facilement" si votre SGBD supporte les fonctions de fenêtrage.

    => quel est votre SGBD ?

    J'utilise Sybase.

    Merci

  4. #4
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A.AdmID, Max(A.dateTime) , A.optionID, Min(A.dateTime)
    FROM table A
    GROUP BY A.AdmID, A.optionID;
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par MASSAKA Voir le message
    J'utilise Sybase.
    Quelle version ?
    Sybase ASE toute ne supporte pas les fonctions de fenêtrage.
    Sybase IQ les supporte.

  6. #6
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Quelle version ?
    Sybase ASE toute ne supporte pas les fonctions de fenêtrage.
    Sybase IQ les supporte.
    c'est ASE que j'utilise.

    Je ne peux donc faire cela en SQL ?

    Peut-on faire des procédures stockées pour cela ?

    merci

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Si, c'est probablement faisable mais ça complexifie énormément la syntaxe.
    L'autre je l'avais sous le coude, là il faudrait chercher beaucoup plus longtemps et je n'en aurai pas le temps.

    En langage procédural ça doit effectivement être plus simple / performant sans accès aux fonctions de fenêtrage.

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    J'ai donner des pistes dans une discussion dont le problème me semble similaire :
    http://www.developpez.net/forums/d88...es-se-suivent/
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    J'ai lu que la fonction identity dans sybase permet plus ou moins "d'émuler" le row_number() en passant par une table temporaire.
    Comme j'ai pas sybase à disposition, je suis peut être loin de la réalité
    A tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT identity(10) AS pos,
           adminid,
           datetime,
           optionid
    INTO #t1
    FROM nom_table
    ORDER BY adminid, datetime
    Si ça fonctionne, vous pouvez essayer cette requete pour ne conserver que les valeurs interessantes, la colonne 'seul' servant à gérer les plages d'une seule valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT 
           identity(10) AS pos,
           t.adminid,
           t.datetime,
           t.optionid,
           CASE WHEN (t.optionid <> coalesce(prec.optionid,'0') AND t.optionid <> coalesce(suiv.optionid,'0')) THEN 1 ELSE 0 END AS seul
    INTO #t2
    FROM #t1 t
    LEFT JOIN #t1 prec ON prec.pos = t.pos-1
    LEFT JOIN #t1 suiv ON suiv.pos = t.pos+1
    WHERE t.optionid = 'x'
    AND (t.optionid <> prec.optionid OR t.optionid <> suiv.optionid OR prec.optionid IS NULL OR suiv.optionid IS NULL)
    ORDER BY seul, t.adminid, t.datetime
    Dernière étape, les valeurs min de la plage sont sur les positions impaires, les max sur les paires, les plages d'une seule valeur sont ajoutées avec une union :
    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
     
    SELECT min.adminid, 
           min.datetime as min, 
           max.datetime as max
    FROM #t2 min
    JOIN #t2 max ON min.pos = max.pos-1
    WHERE mod(min.pos,2) = 1
      AND min.seul = 0
      AND max.seul = 0
    UNION ALL
    SELECT seul.adminid, 
           seul.datetime as min, 
           seul.datetime as max
    FROM #t2 seul
    WHERE seul.seul = 1
    ORDER BY adminid, min

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Quelle horreur les gars....

    Plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT AdmID, 
           (SELECT MIN("dateTime") 
            FROM   T AS T1 
            WHERE  T1.AdmID = T0.AdmID) AS DT_MIN,
           (SELECT MAX("dateTime") 
            FROM   T AS T2 
            WHERE  T2.AdmID = T0.AdmID) AS DT_MAX
    FROM   T AS T0
    Avec :

    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
    CREATE TABLE T 
    (AdmID INT,
     "dateTime" DATETIME,
     optionID CHAR(1));
    GO
    INSERT INTO T VALUES (
    1, '10.10.2009 08:03:23', 'x'), (
    1, '10.10.2009 08:03:53', 'x'), (
    1, '10.10.2009 08:04:20', 'x'), (
    1, '10.10.2009 08:05:13', 'y'), (
    1, '10.10.2009 08:05:53', 'y'), (
    1, '10.10.2009 08:06:33', 'y'), (
    1, '10.10.2009 08:06:53', 'x'), (
    1, '10.10.2009 08:07:53', 'x'), (
    1, '10.10.2009 08:08:33', 'y'), (
    1, '10.10.2009 08:09:13', 'z'), (
    1, '10.10.2009 08:10:23', 'z'), (
    2, '11.10.2009 08:03:23', 'x'), (
    2, '11.10.2009 08:03:53', 'x'), (
    2, '11.10.2009 08:04:20', 'x'), (
    2, '11.10.2009 08:05:13', 'y'), (
    2, '11.10.2009 08:05:53', 'y'), (
    2, '11.10.2009 08:06:33', 'y'), (
    2, '11.10.2009 08:06:53', 'x'), (
    2, '11.10.2009 08:07:53', 'x'), (
    2, '11.10.2009 08:08:33', 'y'), (
    2, '11.10.2009 08:09:13', 'z'), (
    2, '11.10.2009 08:10:23', 'z');
    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...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Oui c'est sûr que c'est plus simple, par contre à moins que quelque chose ne m'échappe, ça ne donne pas du tout ce qui est demandé.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    il faut ajouter le critère option
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT DISTINCT AdmID, 
           (SELECT MIN("dateTime") 
            FROM   T AS T1 
            WHERE  T1.AdmID = T0.AdmID
           And T1.optID = T0.optID) AS DT_MIN,
           (SELECT MAX("dateTime") 
            FROM   T AS T2 
            WHERE  T2.AdmID = T0.AdmID
            And T1.optID = T0.optID) AS DT_MAX
    FROM   T AS T0

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT DISTINCT AdmID, 
           (SELECT MIN("dateTime") 
            FROM   T AS T1 
            WHERE  T1.AdmID = T0.AdmID
           AND T1.optID = T0.optID) AS DT_MIN,
           (SELECT MAX("dateTime") 
            FROM   T AS T2 
            WHERE  T2.AdmID = T0.AdmID
            AND T2.optID = T0.optID) AS DT_MAX
    FROM   T AS T0

  14. #14
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Oui c'est sûr que c'est plus simple, par contre à moins que quelque chose ne m'échappe, ça ne donne pas du tout ce qui est demandé.
    Effectivement, cela ne donne pas le résultat voulu

    sous Mysql cela done

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    +-------+---------------------+---------------------+
    | AdmID | DT_MIN                   | DT_MAX              |
    +-------+---------------------+---------------------+
    |     1 | 2009-10-10 08:03:23 | 2009-10-11 08:10:23 |
    |     2 | 2009-10-11 08:03:23 | 2009-10-11 08:10:23 |
    +-------+---------------------+---------------------+

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Donc, vous utilisez sybase ou MySQL?

  16. #16
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par teach Voir le message
    plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT DISTINCT AdmID, 
           (SELECT MIN("dateTime") 
            FROM   T AS T1 
            WHERE  T1.AdmID = T0.AdmID
           AND T1.optID = T0.optID) AS DT_MIN,
           (SELECT MAX("dateTime") 
            FROM   T AS T2 
            WHERE  T2.AdmID = T0.AdmID
            AND T2.optID = T0.optID) AS DT_MAX
    FROM   T AS T0
    cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    +-------+---------------------+---------------------+
    | AdmID | DT_MIN                   | DT_MAX              |
    +-------+---------------------+---------------------+
    |     1  | 2009-10-10 08:03:23 | 2009-10-10 08:07:53 |
    |     1 | 2009-10-10 08:05:13 | 2009-10-10 08:08:33 |
    |     1 | 2009-10-10 08:09:13 | 2009-10-11 08:10:23 |
    |     2 | 2009-10-11 08:03:23 | 2009-10-11 08:07:53 |
    |     2 | 2009-10-11 08:05:13 | 2009-10-11 08:08:33 |
    |     2 | 2009-10-11 08:09:13 | 2009-10-11 08:10:23 |
    +-------+---------------------+---------------------+

  17. #17
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Donc, vous utilisez sybase ou MySQL?
    J'utilise Sybase ASE (en Prod), mais Mysql pour les tests..

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    C'est pratique!
    Donc, avez vous testé ce que je vous ai proposé?

  19. #19
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Snipah Voir le message
    C'est pratique!
    Donc, avez vous testé ce que je vous ai proposé?
    Merci

    Oui je viens de le tester. Mais cela ne corresponds pas à ce que je veux

    Si on ajoute a votre requete le critere

    J'ai

    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
     
     
    mysql> SELECT DISTINCT AdmID,
        ->        (SELECT MIN(dateTim)
        ->         FROM   T AS T1
        ->         WHERE  T1.AdmID = T0.AdmID
        ->        AND T1.optionID = T0.optionID) AS DT_MIN,
        ->        (SELECT MAX(dateTim)
        ->         FROM   T AS T2
        ->         WHERE  T2.AdmID = T0.AdmID
        ->         AND T2.optionID = T0.optionID) AS DT_MAX
        ->
        -> FROM   T AS T0
        ->
        ->  where  optionID='x';
    +-------+---------------------+---------------------+
    | AdmID | DT_MIN              | DT_MAX              |
    +-------+---------------------+---------------------+
    |     1 | 2009-10-10 08:03:23 | 2009-10-10 08:07:53 |
    |     2 | 2009-10-11 08:03:23 | 2009-10-11 08:07:53 |
    +-------+---------------------+---------------------+
    2 rows in set (0.00 sec)

    Ce qui n'est pas le résultat voulu:

    pour AdmId =1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AdmID         min                                              max 
    1                10.10.2009 08:03:23                   10.10.2009 08:04:20
    1                10.10.2009 08:06:53                   10.10.2009 08:07:53
    Date début et date fin des plages ou optionId = x

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Oui, seulement ce n'est pas moi qui ai proposé cette requête.

Discussions similaires

  1. [Dojo] DateTextBox : constraints min/max par défaut
    Par VinceCBA dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 02/07/2013, 10h48
  2. Algorithme Min-Max appliqué au jeu Puissance 4 en C .
    Par hebmaster dans le forum Intelligence artificielle
    Réponses: 17
    Dernier message: 29/10/2012, 07h33
  3. requête pour avoir min/max par intervales
    Par MASSAKA dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2010, 18h41
  4. [C++.NET] Valeurs min/max dans une TextBox
    Par raboin dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 06/04/2006, 17h15
  5. Emuler un min/max-width ou un min/max-height
    Par Perceval dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 18/09/2005, 18h43

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