Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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 13/01/2012, 11h30   #1
Candidat au titre de Membre du Club
 
Inscription : novembre 2004
Messages : 36
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 36
Points : 11
Points : 11
Par défaut Obtenir l'identifiant d'une ligne avec un ordre sur deux colonnes et un group by sur une autre

Mon problème est (d'apparence) simple : je veux récupérer le dernier IDCommandeSuiviColis de chaque IdentifiantColis trié par DateEvenement, HeureEvenement puis IDCommandeSuiviColis.

Voici ma structure de table simplifiée (je ne suis pas responsable de la structure et ne peux la modifier) :
Code :
1
2
3
4
5
6
7
8
CREATE TABLE [COMMANDE_SUIVI_COLIS] (
	[IDCommandeSuiviColis] int IDENTITY(1,1) NOT NULL,
	[DateEvenement] datetime NULL,
	[HeureEvenement] datetime NULL,
	[IDCommande] int NULL,
	[IDCommandeSuiviEvenement] int NULL,
	[IdentifiantColis] varchar(20) COLLATE French_CI_AS NULL
)
Voici un jeu de test :
Code :
1
2
3
4
5
6
7
8
INSERT INTO [COMMANDE_SUIVI_COLIS] ([IDCommandeSuiviColis], [DateEvenement], [HeureEvenement], [IDCommande], [IDCommandeSuiviEvenement], [IdentifiantColis]) VALUES ('1', '2011-11-15 00:00:00.0', '1900-01-01 08:57:00.0', '1646', '166', '123456789       ');
INSERT INTO [COMMANDE_SUIVI_COLIS] ([IDCommandeSuiviColis], [DateEvenement], [HeureEvenement], [IDCommande], [IDCommandeSuiviEvenement], [IdentifiantColis]) VALUES ('2', '2011-11-15 00:00:00.0', '1900-01-01 08:57:00.0', '1646', '164', '123456789       ');
INSERT INTO [COMMANDE_SUIVI_COLIS] ([IDCommandeSuiviColis], [DateEvenement], [HeureEvenement], [IDCommande], [IDCommandeSuiviEvenement], [IdentifiantColis]) VALUES ('3', '2011-11-15 00:00:00.0', '1900-01-01 08:57:00.0', '1646', '169', '123456789       ');
INSERT INTO [COMMANDE_SUIVI_COLIS] ([IDCommandeSuiviColis], [DateEvenement], [HeureEvenement], [IDCommande], [IDCommandeSuiviEvenement], [IdentifiantColis]) VALUES ('4', '2011-11-15 00:00:00.0', '1900-01-01 08:57:00.0', '1646', '171', '123456789       ');
INSERT INTO [COMMANDE_SUIVI_COLIS] ([IDCommandeSuiviColis], [DateEvenement], [HeureEvenement], [IDCommande], [IDCommandeSuiviEvenement], [IdentifiantColis]) VALUES ('5', '2011-12-08 00:00:00.0', '1900-01-01 12:13:00.0', '1646', '166', '3411061000008517');
INSERT INTO [COMMANDE_SUIVI_COLIS] ([IDCommandeSuiviColis], [DateEvenement], [HeureEvenement], [IDCommande], [IDCommandeSuiviEvenement], [IdentifiantColis]) VALUES ('6', '2011-11-08 00:00:00.0', '1900-01-01 12:13:00.0', '1646', '33', '3411061000008517');
INSERT INTO [COMMANDE_SUIVI_COLIS] ([IDCommandeSuiviColis], [DateEvenement], [HeureEvenement], [IDCommande], [IDCommandeSuiviEvenement], [IdentifiantColis]) VALUES ('7', '2011-11-08 00:00:00.0', '1900-01-01 12:13:00.0', '1646', '50', '3411061000008517');
INSERT INTO [COMMANDE_SUIVI_COLIS] ([IDCommandeSuiviColis], [DateEvenement], [HeureEvenement], [IDCommande], [IDCommandeSuiviEvenement], [IdentifiantColis]) VALUES ('8', '2011-11-08 00:00:00.0', '1900-01-01 12:13:00.0', '1646', '21', '3411061000008517');
Pour le jeu de test suivi, je dois obtenir : 4 (identifiantcolis 123456789) et 5 (identifiantcolis 3411061000008517).

Merci de votre aide.
Doc.Fusion est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 11h33   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 654
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 654
Points : 2 656
Points : 2 656
Bonjour,

Pour ce genre d'exercice vous pouvez utiliser les fonctions de fenêtrage : http://sqlpro.developpez.com/article...clause-window/
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 11h40   #3
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
... du genre :

Code :
1
2
3
4
5
6
7
8
9
10
11
WITH CTE
AS
(
	SELECT 
	 ROW_NUMBER() OVER (PARTITION BY IdentifiantColis ORDER BY DateEvenement DESC) AS num,
	 * 
	FROM COMMANDE_SUIVI_COLIS
)
SELECT *
FROM CTE
WHERE num = 1;
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 11h58   #4
Candidat au titre de Membre du Club
 
Inscription : novembre 2004
Messages : 36
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 36
Points : 11
Points : 11
Merci beaucoup !
Doc.Fusion 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 19h22.


 
 
 
 
Partenaires

Hébergement Web