我正在设计一个表,它将包含一些随时间变化的对象的属性。
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更新)
答案 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)
ROW_NUMBER
为每个ObjectType
- 组订单返回一行ID DESC
(所以ID最高的记录)。如果您想按特定ID过滤,则只需要在CTE或外部WHERE
中应用适当的SELECT
子句。
答案 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