Bonjour,
J'aimerais un complément d'explication sur un truc.
Je plante le décor...
[DECOR]
Il s'agit d'une DB modélisant la gestion de gifts (gift-card et gift-cheque) pour une chaine de magasins.
Le truc c'est que je récupère les données d'une vieille DB sans aucune contrainte ni rien du tout bourrées d'incohérences (d'ailleurs elle n'est faite que d'une table qui n'est même pas en 1NF )
Il a été décidé en concertation avec mon chef de tout importer dans la nouvelle DB (correctement normalisée celle-là) et d'éliminer les incohérences après l'importation.
J'ai donc dans la nouvelle DB une table T_SEND_TO_STORE_STS qui contient les envois de gifts depuis l'entrepôt vers les magasins dont la structure complète importe peu. Les seules colonnes intéressantes sont GFT_ID, STR_ID et STS_DATE.
- GFT_ID étant de type INT (et faisant référence à la clef primaire de la table T_GIFT_GFT) qui est l'identifiant du gift
- STR_ID étant de type INT (et faisant référence à la clef primaire de la table T_STORE_STR) qui est l'identifiant du magasin
- STS_DATE étant de type DATETIME qui est la date de l'envoi du gift vers le magasin
Du coup, après importation des données, je me retrouve avec des gifts ayant été envoyés deux fois de suite vers un magasin. Genre 2 personnes bossaient en même temps sur l'ancienne appli et zou, ça fait 2 envois pour le même gift dans la DB. J'vous raconte pas mon étant quand j'ai découvert ce genre de chose en analysant les données que je devais importer... Quelle horreur ! (il y a même des gifts qui sont détruits 2 fois ! )
[/DECOR]
Bref ! Ce que je souhaite, c'est obtenir l'envoi le plus récent pour un gift et un magasin donné.
J'ai donc la requête suivante (dont je sais que vous n'y verrai pas d'objection) :
Cela me donne bien le résultat escompté.
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 T1(GFT_ID, STS_DATE) AS( SELECT GFT_ID, MAX(STS_DATE) FROM DBO.T_SEND_TO_STORE_STS WHERE GFT_ID = 1500822 AND STR_ID = 14 GROUP BY GFT_ID ) SELECT * FROM DBO.T_SEND_TO_STORE_STS STS INNER JOIN T1 ON STS.GFT_ID = T1.GFT_ID AND STS.STS_DATE = T1.STS_DATE
Par contre, je ne comprends pas ce qui m'empêche de faire ceci :
J'avais déjà évoqué le sujet dans une autre discussion et il y avait une histoire de ne pas mélangé le logique et le physique mais je ne comprends toujours pas...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT TOP 1 * FROM DBO.T_SEND_TO_STORE_STS WHERE GFT_ID = 1500822 AND STR_ID = 14 ORDER BY STS_DATE DESC
En triant sur la date de manière descendante et en prenant la première ligne, quel risque y a-t-il ?
Partager