Sélection des inputs les plus récentes avec différents types

Je suis en train de concevoir une table qui contiendra des propriétés de certains objects qui changeront avec le time.

CREATE TABLE [dbo].[ObjectProperties] ( [Id] INT NOT NULL PRIMARY KEY IDENTITY, [ObjectType] SMALLINT NOT NULL, [Width] SMALLINT NOT NULL, [Height] SMALLINT NOT NULL, [Weight] SMALLINT NOT NULL ) 

Disons que j'ai cet ObjectTypes: 1 = Chair 2 = Table

Et datatables pour cette table:

 INSERT INTO [dbo].[ObjectProperties] ([Id], [ObjectType], [Width], [Height], [Weight]) VALUES (1, 1, 50, 50, 1000) INSERT INTO [dbo].[ObjectProperties] ([Id], [ObjectType], [Width], [Height], [Weight]) VALUES (2, 2, 80, 40, 500) INSERT INTO [dbo].[ObjectProperties] ([Id], [ObjectType], [Width], [Height], [Weight]) VALUES (3, 1, 50, 50, 2000) 

Donc, comme vous pouvez le voir, j'avais un object chaise dont le poids était de 1000 puis j'ai changé de poids à 2000. Et je stocke quelque chose comme l'histoire de la modification des propriétés des objects. Maintenant, je veux sélectionner les dernières données de cette table pour chaque object. Je sais comment sélectionner les dernières données pour chaque object un par un:

 SELECT TOP 1 * FROM [ObjectProperties] WHERE ObjectType = 1 ORDER BY Id DESC 

Mais que faire si je veux sélectionner quelques objects avec une requête? Comme

 SELECT ... * FROM [ObjectProperties] WHERE ObjectType IN (1, 2) ... 

Et recevoir des lignes avec les identifiants 2 et 3 (parce que 3 a des propriétés plus récentes pour le président que 1)

Vous pouvez utiliser une fonction de classment CTE avec ROW_NUMBER :

 WITH CTE AS( SELECT *, RN=ROW_NUMBER()OVER(PARTITION BY ObjectType ORDER BY ID DESC) FROM [ObjectProperties] op ) SELECT * FROM CTE WHERE RN = 1 AND ObjectType IN (1, 2) 

Démo

Le ROW_NUMBER renvoie une ligne pour chaque ordre ObjectType par ID DESC (donc l'logging avec l'ID le plus élevé) .Si vous voulez filterr par certains ID, il suffit d'appliquer la clause WHERE appropriée, soit dans le CTE ou dans le SELECT .

Fonctions de classment

Un moyen simple (certes brut) est le suivant:

 select * from ObjectProperties where id in (select max(id) from ObjectProperties group by objecttype) 

Cela donne:

 Id ObjectType Width Height Weight ----------- ---------- ------ ------ ------ 2 2 80 40 500 3 1 50 50 2000