2013-07-17 24 views
4

我設計的表將包含將隨時間而改變的一些對象的屬性。選擇不同類型的最新條目

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 
) 

比方說,我有這樣的對象類型: 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) 

所以,你可以看到我有主席對象,它重量是1000,然後我將重量更改爲2000.並且我存儲了對象屬性的修改歷史記錄等內容。 現在我想從這個表格中爲每個對象選擇最新的數據。我知道如何通過一個爲每個對象選擇一個最新數據:

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

但如果我要選擇一個查詢幾個對象是什麼?像

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

和接收IDS 2和第3行(因爲3對主席比1更新的屬性)

回答

4

您可以使用CTE與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) 

Demo

ROW_NUMBER返回一行ObjectType -group order by ID DESC(so the record wit h最高ID)。如果您想按特定ID進行篩選,您只需在CTE中或外部SELECT中應用相應的WHERE子句。

Ranking Functions

+0

所以,這種方式是選擇比簡單的快選擇? – bobby

+1

排名函數非常有效,但是 - 更重要的是 - 它們比具有GROUP BY的子選擇更具可讀性和可維護性。順便說一句,感謝100k Reps :) –

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