Sélectionnez l'logging avec la valeur la plus élevée dans un autre select

J'ai besoin d'aide avec un Select.

Ce qui suit est une tentative de vous donner un exemple des données.

Nombre: 1 | Date: 2014-05-01 | Code client: 001 | Statut: P | Séquence: 0 |

Nombre: 1 | Date: 2014-05-01 | Code client: 001 | Statut: X | Séquence: 1 |

Numéro: 2 | Date: 2014-06-30 | Code client: 005 | Statut: X | Séquence: 0 |

Numéro: 2 | Date: 2014-06-30 | Code client: 005 | Statut: Z | Séquence: 1 |

Numéro: 2 | Date: 2014-06-30 | Code client: 005 | Statut: A | Séquence: 2 |

J'ai besoin d'un Select qui me donne tous les loggings avec la "Séquence" la plus élevée parmi ceux avec le même "Nombre"

La sortie désirée returnnera les lignes avec le Nombre 1 / Séquence 1 et Numéro 2 / Séquence 4

J'ai réussi à le faire avec l'utilisation d'une table temporaire mais c'est très lent.

Pouvez-vous m'aider?

Merci d'avance

SELECT * FROM table t WHERE NOT EXISTS ( SELECT 'a' FROM table t2 WHERE t2.number = t.number AND t2.sequence > t.sequence ) 

Utilisez ROW_NUMBER() pour cela:

 ;WITH TestTable(Number, Date, ClientCode, Status, Sequence) AS( SELECT 1, '2014-05-01', '001', 'P', 0 UNION ALL SELECT 1, '2014-05-01', '001', 'X', 1 UNION ALL SELECT 2, '2014-06-30', '005', 'X', 0 UNION ALL SELECT 2, '2014-06-30', '005', 'P', 1 UNION ALL SELECT 2, '2014-06-30', '005', 'X', 2 UNION ALL SELECT 10, '2015-01-01', '555', 'P', 0 UNION ALL SELECT 15, '2015-02-08', '666', 'P', 0 UNION ALL SELECT 15, '2015-02-08', '666', 'C', 1 UNION ALL SELECT 15, '2015-02-08', '666', 'T', 2 UNION ALL SELECT 15, '2015-02-08', '666', 'X', 3 UNION ALL SELECT 15, '2015-02-08', '666', 'X', 4 ) SELECT Number, Date, ClientCode, Status, Sequence FROM( SELECT *, RN = ROW_NUMBER() OVER(PARTITION BY Number ORDER BY Sequence DESC) FROM TestTable )t WHERE RN = 1 

RÉSULTAT

 Number Date ClientCode Status Sequence ----------- ---------- ---------- ------ ----------- 1 2014-05-01 001 X 1 2 2014-06-30 005 X 2 10 2015-01-01 555 P 0 15 2015-02-08 666 X 4 

Utilisez une sous-requête corrélée pour find la valeur de séquence maximale de chaque numéro:

 SELECT * FROM TableName t1 where sequence = (select max(sequence) from tablename t2 where t1.number = t2.number) 

Va renvoyer les deux lignes si un nombre avec deux mêmes lignes de séquence max.

Essaye ça..

 With x as (select number, max(sequence)from yourfile group by number) select y.number,y.sequence,y.clientcode from x, yourfile y where x.number=y.number and y.sequence=x.sequence 

Essaye ça:

 SELECT Number, Date, ClientCode, Status, Max( Sequence) FROM TableName Group by ClientCode; 

Il suffit de grouper par code client et d'utiliser la fonction d'agrégat max sur la séquence pour get la valeur associée au code de séquence max.