Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/01/2011, 09h34   #1
Expert Confirmé Sénior
 
Avatar de Pol63
 
Homme Sébastien
Développeur informatique
Inscription : avril 2007
Messages : 9 197
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : avril 2007
Messages : 9 197
Points : 13 423
Points : 13 423
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
__________________
si vous ne comprenez pas ce que je dis, demandez à google
Pol63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 10h41   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Citation:
sans doublons successifs
utilisez GROUP BY

Citation:
le tout trié
utilisez ORDER BY
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 10h46   #3
Expert Confirmé Sénior
 
Avatar de Pol63
 
Homme Sébastien
Développeur informatique
Inscription : avril 2007
Messages : 9 197
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : avril 2007
Messages : 9 197
Points : 13 423
Points : 13 423
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 ...
__________________
si vous ne comprenez pas ce que je dis, demandez à google
Pol63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 10h57   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 11h02   #5
Expert Confirmé Sénior
 
Avatar de Pol63
 
Homme Sébastien
Développeur informatique
Inscription : avril 2007
Messages : 9 197
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : avril 2007
Messages : 9 197
Points : 13 423
Points : 13 423
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
__________________
si vous ne comprenez pas ce que je dis, demandez à google
Pol63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 11h27   #6
Expert Confirmé Sénior
 
Avatar de Pol63
 
Homme Sébastien
Développeur informatique
Inscription : avril 2007
Messages : 9 197
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : avril 2007
Messages : 9 197
Points : 13 423
Points : 13 423
j'ai finalement réussi

Code :
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
__________________
si vous ne comprenez pas ce que je dis, demandez à google
Pol63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 11h35   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Code sql :
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 11h47   #8
Expert Confirmé Sénior
 
Avatar de Pol63
 
Homme Sébastien
Développeur informatique
Inscription : avril 2007
Messages : 9 197
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : avril 2007
Messages : 9 197
Points : 13 423
Points : 13 423
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
__________________
si vous ne comprenez pas ce que je dis, demandez à google
Pol63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 12h49   #9
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
1
2
 
OR cte2.val IS NULL
a la fin de la requete
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 13h34   #10
Expert Confirmé Sénior
 
Avatar de Pol63
 
Homme Sébastien
Développeur informatique
Inscription : avril 2007
Messages : 9 197
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : avril 2007
Messages : 9 197
Points : 13 423
Points : 13 423
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
__________________
si vous ne comprenez pas ce que je dis, demandez à google
Pol63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 13h56   #11
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Vous avez des NULL dans votre table initiale ???
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 14h07   #12
Expert Confirmé Sénior
 
Avatar de Pol63
 
Homme Sébastien
Développeur informatique
Inscription : avril 2007
Messages : 9 197
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : avril 2007
Messages : 9 197
Points : 13 423
Points : 13 423
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
__________________
si vous ne comprenez pas ce que je dis, demandez à google
Pol63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 15h22   #13
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Une autre solution :
Code :
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.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 15h36   #14
Expert Confirmé Sénior
 
Avatar de Pol63
 
Homme Sébastien
Développeur informatique
Inscription : avril 2007
Messages : 9 197
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : avril 2007
Messages : 9 197
Points : 13 423
Points : 13 423
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
__________________
si vous ne comprenez pas ce que je dis, demandez à google
Pol63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h16.


 
 
 
 
Partenaires

Hébergement Web