选择具有不同类型的最新条目

时间:2013-07-17 10:51:10

标签: sql-server performance

我正在设计一个表,它将包含一些随时间变化的对象的属性。

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
)

假设我有这个ObjectTypes: 1 =主席 2 =表

此表的数据:

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)

所以,你可以看到我有一个Weight为1000的Chair对象,然后我将权重改为2000.而且我存储了像对象属性的修改历史。 现在我想从这个表中为每个对象选择最新的数据。我知道如何逐个选择每个对象的最新数据:

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

但是,如果我想用一个查询选择几个对象怎么办?像

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

并接收带有ID 2和3的行(因为3的主席属性比1更新)

2 个答案:

答案 0 :(得分:4)

您可以使用具有ROW_NUMBER排名功能的CTE:

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)

Demo

ROW_NUMBER为每个ObjectType - 组订单返回一行ID DESC(所以ID最高的记录)。如果您想按特定ID过滤,则只需要在CTE或外部WHERE中应用适当的SELECT子句。

Ranking Functions

答案 1 :(得分:3)

一种简单的(公认的粗略)方式如下:

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

这给出了:

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