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

SQL Oracle Discussion :

Retrouver la valeur apparaissant le plus de fois


Sujet :

SQL Oracle

  1. #1
    Membre Expert
    Avatar de doc malkovich
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2008
    Messages
    1 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 884
    Billets dans le blog
    1
    Par défaut Retrouver la valeur apparaissant le plus de fois
    Hello,

    Je cherche à retrouver par une colonne donnée la valeur qui apparait le +.
    Par exemple si on a TOTO :
    1, x, 01/08/2009
    1, x, 15/08/2009
    1, y, 17/08/2009
    1, x, 18/08/2009
    1, y, 19/08/2009
    je veux retrouver 1, x car x apparait 3 fois

    j'y arrive avec un FIRST_VALUE et un sous-select :
    select distinct col1,first_value(col2) over(partition by col1 order by nb desc)
    from
    (
    select col1,col2,count(*) nb
    from TOTO
    group by col1,col2
    )

    mais bizarrement je me dis qu'on pourrait le faire sans sous-select, sans distinct et d'une manière + élégante
    y a -t-il une fonction oracle pour le récupérer + facilement ?

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous pouvez utiliser keep :
    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
    With TOTO AS
    (
    select 1 as Col1, 'x' as Col2, to_date('01/08/2009', 'dd/mm/yyyy') as Col3 from dual union all
    select 1        , 'x'        , to_date('15/08/2009', 'dd/mm/yyyy')         from dual union all
    select 1        , 'y'        , to_date('17/08/2009', 'dd/mm/yyyy')         from dual union all
    select 1        , 'x'        , to_date('18/08/2009', 'dd/mm/yyyy')         from dual union all
    select 1        , 'y'        , to_date('19/08/2009', 'dd/mm/yyyy')         from dual
    )
    select
        max(Col1) keep (dense_rank first order by count(*) desc) as Col1,
        max(Col2) keep (dense_rank first order by count(*) desc) as Col2
    from
        TOTO
    group by
        Col1,
        Col2;
     
    COL1	COL2
    1	x
    Attention toutefois, comment voulez-vous gérer les cas où vous avez le même nombre de couple (Col1, Col2) ?

  3. #3
    Membre Expert
    Avatar de doc malkovich
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2008
    Messages
    1 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 884
    Billets dans le blog
    1
    Par défaut
    Merci Waldar

    Ah oui, bien vu le fameux keep, utilisé avec un order by count(*), je ne savais pas qu'on pouvait faire ça

    Hum par contre, j'ai un peu de mal à l'utiliser, mon exemple en effet était trop succinct, je peux avoir d'autre valeurs pour la colonne 1 ( que je me suis permis de renommer en triturant tout ça) :

    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
     
    With TOTO AS
    (
    select 1 as   id, 'x' as Val , to_date('01/08/2009', 'dd/mm/yyyy') as Dat3 from dual union all
    select 1        , 'x'        , to_date('15/08/2009', 'dd/mm/yyyy')         from dual union all
    select 1        , 'y'        , to_date('17/08/2009', 'dd/mm/yyyy')         from dual union all
    select 1        , 'x'        , to_date('18/08/2009', 'dd/mm/yyyy')         from dual union all
    select 1        , 'y'        , to_date('19/08/2009', 'dd/mm/yyyy')         from dual union all
    select 1        , 'y'        , to_date('20/08/2009', 'dd/mm/yyyy')         from dual union all
    select 2        , 'x'        , to_date('01/08/2009', 'dd/mm/yyyy')         from dual 
    )
    select
        max(id ) keep (dense_rank first order by count(*) desc) as id,
        max(Val) keep (dense_rank first order by count(*) desc) as Val
    from
        TOTO
    group by
        id,
        Val
    je veux en résultat
    - ( 1, x ) ou ( 1, y ), mais pas les 2
    - ( 2, x )

    là j'ai juste ( 1, y ), pas le ( 2, x)
    je n'arrive pas à réécrire la requête en enlevent le max(id ) keep (dense_rank first order by count(*) desc) - il manque un group by ?

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select col1,stats_mode(col2) from t group by col1;

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il faut s'avoir s'incliner :

  6. #6
    Membre Expert
    Avatar de doc malkovich
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2008
    Messages
    1 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 884
    Billets dans le blog
    1
    Par défaut
    no comment

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/04/2012, 21h07
  2. Réponses: 3
    Dernier message: 17/12/2008, 11h49
  3. Réponses: 1
    Dernier message: 18/06/2007, 09h08
  4. Réponses: 17
    Dernier message: 03/10/2005, 11h16
  5. Encore une question, pour retrouver 2 valeur d'une table
    Par danje dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/09/2005, 00h11

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