Sélection des lignes modifiées à partir d'une table d'audit

J'ai une table d'audit qui se connecte lorsqu'un user change un code nominal pour une list de pièces.

Comme vous pouvez le voir la première colonne est la partie, la deuxième colonne est la date changée et la troisième est un code nominal.
Ceci est juste un échantillon des données, la table a réellement une énorme quantité de lignes.

Je ne veux ramener que les parties où le code nominal a changé, en montrant ce qu'il était à l'origine et ce qu'il est maintenant.
Fondamentalement, il y avait un bug où un process a continué à changer le code, donc j'ai besoin de savoir ce que c'était avant.

 |  PART |  DATE CHANG |  Code nominal
 | ------------ | ------------ | -------
 |  ENGINEWORK |  05/08/2014 |  4000 |
 |  ENGINEWORK |  06/08/2014 |  4007 |
 |  ENGINEWORK |  04/09/2014 |  4007 |
 |  ENGINEWORK |  05/09/2014 |  4007 |
 |  ENGINEWORK |  15/09/2014 |  4007 |
 |  ENGINEWORK |  25/09/2014 |  4007 |
 |  HYPOIDOIL |  05/08/2014 |  4005 |
 |  HYPOIDOIL |  07/08/2014 |  4005 |
 |  HYPOIDOIL |  08/08/2014 |  4000 |
 |  HYPOIDOIL |  14/08/2014 |  4000 |
 |  LLB382 |  05/08/2014 |  5000 |
 |  LLB382 |  07/08/2014 |  4000 |
 |  LLB382 |  07/08/2014 |  5000 |
 |  LLB382 |  08/08/2014 |  4000 |
 |  LLB382 |  14/08/2014 |  4000 |
 |  LLB382 |  20/10/2014 |  4000 |

Je crois que le jeu de résultats souhaité s'affiche chaque fois que le numéro de pièce change. Cette requête finda chaque fois que le code change la valeur d'une partie et la date à laquelle cet événement s'est produit.

with rankedResult as ( select t.*, row_number() over ( partition by part order by dateChanged ) as seqnum from Audit t ) select t.part, t.code CurrentCode, t2.code ChangedToCode, t2.dateChanged ChangedDate from rankedResult t inner join rankedResult t2 on t.part = t2.part and t.seqnum = t2.seqnum + 1 and t.code != t2.code; 

Vous semblez vouloir les premières et dernières valeurs pour le code. Je suggère des fonctions de window:

 with t as ( select t.*, row_number() over (partition by part order by datechange) as seqnum, count(*) over (partition by part) as cnt from audit t ) select part, max(case when seqnum = 1 then nominalcode end) as firstcode, max(case when seqnum = cnt then nominalcode end) as lastcode from t group by part having max(case when seqnum = 1 then nominalcode end) <> max(case when seqnum = cnt then nominalcode end);