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

MS SQL Server Discussion :

retirer des doublons successifs


Sujet :

MS SQL Server

  1. #1
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut retirer des doublons successifs
    bonjour

    sql2005

    j'ai une requete qui me retourne une liste de valeurs

    4
    5
    12
    12
    8
    4
    4


    et je voudrais avoir une liste sans doublons successifs en gardant la 1ère occurrence (j'ai d'autres colonnes d'affichées, je veux le 1er changement)

    4
    5
    12
    8
    4

    le tout trié par un champ datetime

    quelqu'un a une idée de comment faire ca ?

    merci

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

    sans doublons successifs
    utilisez GROUP BY

    le tout trié
    utilisez ORDER BY

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    lol

    je viens ici parce que le problème me semble complexe, et sans vouloir t'offenser pas pour entendre group by et order by

    je ne veux pas grouper par valeur, 2x la même valeur je ne suis pas contre mais pas successivement


    je suis en train de voir si j'y arrive avec une CTE ...

  4. #4
    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
    Citation Envoyé par Pol63 Voir le message
    lol

    je viens ici parce que le problème me semble complexe
    Alors expose le dans sa totalité...

    comment devine-t-on la structure de tes tables ? tu parles d'un tri sur une colonne (et non pas champ) date, mais je ne vois de date nul part dans ton post.


    Si tu veux une réponse complète et détaillée, pose une question complète et détaillée :

    Structure des tables
    Requête que as déjà faite
    et éventuellement un jeu d'essai + résultat voulu

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    ca me parait bien exposé, y a le contenu de la table et ce que je veux au final
    on y voit des valeurs identiques mais plus successivement ...

    après le champ de type datetime, il a est sur la même table ca me parait aussi évident, bon certes j'ai pas dit qu'il y avait une clé

    table (id bigint PK clustered, dt datetime, valeur nvarchar(50))


    et les colonnes c'est dans un tableau il me semble, pas dans une table de base de données

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    j'ai finalement réussi

    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
     
    WITH Valeurs(DateHeure, Valeur, NbLigne) AS 
    (
        SELECT dateheure, Valeur, row_number()over (order by dateheure)
            FROM table
    )
    ,
     
    Recur (DateHeure, Valeur, NbLigne) AS
    (
        SELECT DateHeure, Valeur, NbLigne FROM Valeurs WHERE NbLigne = 1
     
        UNION ALL
     
        SELECT case when Valeurs.Valeur <> Recur.Valeur OR (Valeurs.Valeur IS NULL AND Recur.Valeur IS NOT NULL) OR (Valeurs.Valeur IS NOT NULL AND Recur.Valeur IS NULL) then Valeurs.DateHeure else NULL end, 
                  Valeurs.Valeur, Valeurs.NbLigne 
            FROM Valeurs
                INNER JOIN Recur ON Valeurs.NbLigne = Recur.NbLigne + 1
    )
     
    SELECT DateHeure, Valeur FROM Recur WHERE DateHeure IS NOT NULL
    ca me parait pas trop moche ... à part peut etre la combine de mettre null via un case pour pouvoir continuer la récursivité ...

    merci quand même

  7. #7
    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
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    WITH cte(id, dte, val, ind) AS (
    SELECT id, dte, val, ROW_NUMBER() OVER (ORDER BY dte) 
    FROM MaTable)
    SELECT cte1.dte, cte1.val
    FROM cte cte1
    LEFT OUTER JOIN cte cte2 ON cte1.ind = cte2.ind+1
    WHERE cte1.val != cte2.val

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    ca fait mal à la tête à comprendre pourquoi ca marche mais ta version est plus courte donc surement plus performante (edit : avec l'affichage du plan d'exécution réel sur l'exécution des 2 à la suite, la tienne fait 48% du temps donc c'est confirmé)

    elle nécessite quelques modifications
    pour les différences avec des null comme j'ai fait
    et pour avoir la 1ère valeur
    SELECT champs FROM table WHERE NbLigne = 1
    UNION ALL la_suite

    merci bien

  9. #9
    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
    En effet pour la premiere valeur

    C'est quand j'ai recopié et adapté la requete que la première valeur a sauté

    mais plutot qu'un UNION, il suffit de rajouter
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    OR cte2.val IS NULL
    a la fin de la requete

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    oui, c'est même surement un bug d'avoir mis union pour les cas où la 1ère ligne ne vaudrait pas null

    m'enfin avec le or ct2.val is null ca me retourne des nulls consécutifs
    donc j'ai mis ca à la place :
    OR (v1.Valeur IS NULL AND v2.Valeur IS NULL AND v2.NbLigne = 1)

    et la différence de performance passe à 61/39

  11. #11
    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
    Vous avez des NULL dans votre table initiale ???

  12. #12
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Vous avez des NULL dans votre table initiale ???
    c'est vrai que je ne l'ai pas mentionné ça

    en fait c'est un code générique pour différentes tables et différents champs, donc j'ai été obligé d'expliquer la fonction générique
    et dans mon cas de test j'avais null null null 12 5 12 12 5 null 12 4, c'est pour ca que j'ai remarqué que ca n'allait pas

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    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
    37
    38
    39
    declare @t table (c1 smalldatetime, c2 tinyint)
     
    insert into @t (c1, c2) values (getdate()-12,    4)
    insert into @t (c1, c2) values (getdate()-11,    5)
    insert into @t (c1, c2) values (getdate()-10,   12)
    insert into @t (c1, c2) values (getdate()- 9,   12)
    insert into @t (c1, c2) values (getdate()- 8, null)
    insert into @t (c1, c2) values (getdate()- 7, null)
    insert into @t (c1, c2) values (getdate()- 6,    8)
    insert into @t (c1, c2) values (getdate()- 5,    4)
    insert into @t (c1, c2) values (getdate()- 4,    4)
    insert into @t (c1, c2) values (getdate()- 3,    5)
    insert into @t (c1, c2) values (getdate()- 2,   12)
    insert into @t (c1, c2) values (getdate()- 1,   12)
    insert into @t (c1, c2) values (getdate()   ,    8)
     
    ;with CTInit (c1, c2, grp) as
    (
    select c1, c2,
           row_number() over(                order by c1 asc) -
           row_number() over(partition by c2 order by c1 asc)
      from @t
    )
      select min(c1) as c1, c2
        from CTInit
    group by c2, grp
    order by c1 asc;
     
    c1                      c2
    ----------------------- ----
    2010-12-24 15:22:00     4
    2010-12-25 15:22:00     5
    2010-12-26 15:22:00     12
    2010-12-28 15:22:00     NULL
    2010-12-30 15:22:00     8
    2010-12-31 15:22:00     4
    2011-01-02 15:22:00     5
    2011-01-03 15:22:00     12
    2011-01-05 15:22:00     8
    Citation Envoyé par Pol63 Voir le message
    et les colonnes c'est dans un tableau il me semble, pas dans une table de base de données
    On parle bien de lignes et de colonnes pour les tables également.

  14. #14
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    légèrement plus rapide encore oui
    je ne connais le partition BY, je vais regarder ce que ca fait

    Citation Envoyé par Waldar Voir le message
    On parle bien de lignes et de colonnes pour les tables également.

    toutes mes excuses à vous deux, même http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L2 vous donne raison ...


    en tout cas merci bien pour les différentes syntaxes

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

Discussions similaires

  1. [Vxi3] Retirer des faux doublons
    Par Benouche20 dans le forum Webi
    Réponses: 3
    Dernier message: 21/06/2012, 18h31
  2. retirer des éléments d'une liste avec doublons
    Par tanguy.L dans le forum Prolog
    Réponses: 7
    Dernier message: 28/07/2010, 15h44
  3. [Tableaux] Retirer des doublons dans un tableau
    Par Xunil dans le forum Langage
    Réponses: 2
    Dernier message: 07/11/2006, 18h04
  4. Effacer des doublons
    Par ben53 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/07/2004, 17h56
  5. Réponses: 2
    Dernier message: 07/07/2004, 17h44

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