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 :

Select Group_number sans curseur


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Select Group_number sans curseur
    Bonjour
    Merci des réponses.
    Pas simple à expliquer, simple à comprendre ...

    J'ai cette table

    date AppName
    42324.33862 NULL
    42324.33865 NULL
    42324.33869 LockAppHost
    42324.33882 LockAppHost
    42324.33889 SearchUI
    42324.33915 explorer
    42324.33916 explorer
    42324.33917 explorer
    42324.33918 OUTLOOK
    42324.33918 OUTLOOK
    42324.33921 explorer
    42324.33922 explorer
    42324.33929 OUTLOOK
    42324.33929 explorer
    42324.33935 firefox
    42324.33936 firefox
    42324.33937 firefox
    42324.33937 firefox

    et je cherche à obtenir cette table (sans curseur)

    * date AppName
    1 42324.33862 NULL
    1 42324.33865 NULL
    2 42324.33869 LockAppHost
    2 42324.33882 LockAppHost
    3 42324.33889 SearchUI
    4 42324.33915 explorer
    4 42324.33916 explorer
    4 42324.33917 explorer
    5 42324.33918 OUTLOOK
    5 42324.33918 OUTLOOK
    6 42324.33921 explorer
    6 42324.33922 explorer
    7 42324.33929 OUTLOOK
    8 42324.33929 explorer
    9 42324.33935 firefox
    9 42324.33936 firefox
    9 42324.33937 firefox
    9 42324.33937 firefox


    Merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Et si tu expliquais avec des mots ce que tu cherches à faire ?
    Ce serait plus efficace que de nous faire jouer aux devinettes...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    oui désolé

    je cherche à ajouter la 1ere colonne du second tableau
    comme un numéro de groupe

    avec un curseur ca tombe sous le sens

    je commence à 1
    pour chaque ligne si mon appname (par rapport à la précédente) change j'incrémente

    je sais qu'il existe maintenant des fonctions comme RANK, DENSE_RANK, etc ...

    j'espère que c'est plus clair

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Une table n'est pas ordonnée, par définition.
    Sur quelle(s) colonne(s) ordonnes-tu la liste avant de faire ton traitement ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    les deux tables sont ordonnés sur la colonne date (représenté en float)

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH 
    T0 AS
    (
    SELECT AppName, "Date", MIN() OVER(PARTITION BY AppName) AS NEWDate
    FROM   MaTable)
    SELECT "Date", AppName, DENSE_RANK() OVER(ORDER BY NeWDate) AS RANG
    FROM   T0;

    À l'avenir respectez la charte de postage : http://www.developpez.net/forums/a69...gage-sql-lire/

    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/ * * * * *

  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 814
    Points
    17 814
    Par défaut
    Je l'ai fait de cette façon, création de groupes avec la méthode de Tabibitosan puis gestion du classement pour le tri final.
    Il y a peut-être moyen de simplifier cette seconde partie de la requête.
    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
    60
    61
    62
    63
    64
    65
    66
    67
    with cte_MaTable (ColDate, AppName) as
    (
    select 42324.33862, null          from dual union all
    select 42324.33865, null          from dual union all
    select 42324.33869, 'LockAppHost' from dual union all
    select 42324.33882, 'LockAppHost' from dual union all
    select 42324.33889, 'SearchUI'    from dual union all
    select 42324.33915, 'explorer'    from dual union all
    select 42324.33916, 'explorer'    from dual union all
    select 42324.33917, 'explorer'    from dual union all
    select 42324.33918, 'OUTLOOK'     from dual union all
    select 42324.33918, 'OUTLOOK'     from dual union all
    select 42324.33921, 'explorer'    from dual union all
    select 42324.33922, 'explorer'    from dual union all
    select 42324.33929, 'OUTLOOK'     from dual union all
    select 42324.33929, 'explorer'    from dual union all
    select 42324.33935, 'firefox'     from dual union all
    select 42324.33936, 'firefox'     from dual union all
    select 42324.33937, 'firefox'     from dual union all
    select 42324.33937, 'firefox'     from dual
    )
      ,  cte_tmp_1 (rn, coldate, appname) as
    (
    select row_number() over(order by coldate asc, appname desc)
         , ColDate, AppName
      from cte_matable
    )
        , cte_tmp_2 (rn, grp, coldate, appname) as
    (
    select rn
         , rn
         - row_number() over(partition by AppName order by rn asc) as grp
         , ColDate, AppName
      from cte_tmp_1
    )
        , cte_tmp_3 (rn, coldate_min, coldate, appname) as
    (
    select rn
         , min(coldate) over(partition by grp, appname)
         , coldate, appname
      from cte_tmp_2
    )
      select dense_rank() over(order by coldate_min asc, appname desc) as groupe
           , coldate, appname
        from cte_tmp_3
    order by rn asc;
     
    GROUPE     COLDATE     APPNAME    
    ---------- ----------- -----------
             1 42324.33862 
             1 42324.33865 
             2 42324.33869 LockAppHost
             2 42324.33882 LockAppHost
             3 42324.33889 SearchUI
             4 42324.33915 explorer
             4 42324.33916 explorer
             4 42324.33917 explorer
             5 42324.33918 OUTLOOK
             5 42324.33918 OUTLOOK
             6 42324.33921 explorer
             6 42324.33922 explorer
             7 42324.33929 OUTLOOK
             8 42324.33929 explorer
             9 42324.33935 firefox
             9 42324.33936 firefox
             9 42324.33937 firefox
             9 42324.33937 firefox
    Les second tris sur appname desc sont là uniquement pour donner le résultat souhaité, car rien de permet d'affirmer qui d'explorer ou OUTLOOK doit sortir en premier sur l'égalité à la date 42324.33929.

  8. #8
    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,

    Voici aussi une autre solution :

    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 cte_MaTable (ColDate, AppName) as
    (
    select 42324.33862, null          union all
    select 42324.33865, null          union all
    select 42324.33869, 'LockAppHost' union all
    select 42324.33882, 'LockAppHost' union all
    select 42324.33889, 'SearchUI'    union all
    select 42324.33915, 'explorer'    union all
    select 42324.33916, 'explorer'    union all
    select 42324.33917, 'explorer'    union all
    select 42324.33918, 'OUTLOOK'     union all
    select 42324.33918, 'OUTLOOK'     union all
    select 42324.33921, 'explorer'    union all
    select 42324.33922, 'explorer'    union all
    select 42324.33929, 'OUTLOOK'     union all
    select 42324.33929, 'explorer'    union all
    select 42324.33935, 'firefox'     union all
    select 42324.33936, 'firefox'     union all
    select 42324.33937, 'firefox'     union all
    select 42324.33937, 'firefox'     
    )
    ,	
    cte AS (
    	SELECT *, LAG(appName) OVER(ORDER BY ColDate) as L
    	FROM Cte_Matable
    )
    SELECT 
    		ColDate
    	,	AppName
    	,	1 + SUM( 
    			CASE WHEN EXISTS(SELECT appName EXCEPT SELECT L) THEN 1 ELSE 0 END 
    		) OVER(ORDER BY Coldate, AppName)
    		AS grp
    FROM cte

  9. #9
    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 814
    Points
    17 814
    Par défaut
    Ne manquerait-il pas un petit bout de code là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE WHEN EXISTS(SELECT appName EXCEPT SELECT L) THEN 1 ELSE 0 END

  10. #10
    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
    Non, pas pour SQL Server (le SGBDR n'a pas été précisé...). Pour d'autre SGBD, il faudra sans doute adapter.

    Le but de cette partie et de vérifier si les deux valeurs différent, en prenant en compte les NULL (NULL EXCEPT NULL ne renvoi rien, alors que NULL <> NULL n'est pas faux)


    En l’occurrence, on pourrait aussi écrire CASE WHEN appName = L OR COALESCE(appName, L) IS NULL THEN 0 ELSE 1 END

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/11/2014, 20h48
  2. concatenation dans le select d'un curseur
    Par hoaxpunk dans le forum Oracle
    Réponses: 2
    Dernier message: 11/04/2006, 15h53
  3. Traitement ligne par ligne sans curseur
    Par AbyssoS dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/02/2006, 18h46
  4. [SELECT] multiselection sans utiliser la touche ctrl
    Par Pompil dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/05/2005, 11h51
  5. Faire un Select v1 sans mettre v1 dans Group By
    Par faayy dans le forum Langage SQL
    Réponses: 6
    Dernier message: 12/05/2005, 10h28

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