2011-04-27 133 views
3

我在Oracle SQL中遇到了一個小問題。根據列的最大值選擇行

我有一張表,其中包含以下列 (ID,AttributeID,AttributeValue,Version)。

我想查詢該表的最新版本給定一個屬性ID。

舉例來說,如果我有以下數據

ID AttrId AttrValue Version 
1 1  A   1 
1 1  B   2 
1 1  C   3 
2 1  F   1 
2 2  G   1 

如果我決定id屬性進行過濾,我想獲得

ID AttrId AttrValue Version 
1 1  C   3 
2 1  F   1 

,如果我的查詢會很簡單提供id,因爲我可以先用ID和AttributeID過濾 ,然後找到版本列的最大值。

但是,我仍然在尋找並考慮解決方案,當ID沒有給出,並且 想要僅基於AttributeID獲得列表。

任何提示都會有很大幫助!

謝謝!

+0

什麼RDBMS好嗎? – 2011-04-27 18:24:38

+0

這是Oracle - 讓我更新我的帖子 – aggietech 2011-04-27 18:26:24

回答

2

請問這幫助?

select * from attributes a 
where attribute_id := given_attribute_id 
and version_id = (
select max(version_id) from attributes b 
where attribute_id := given_attibute_id 
and b.id = a.id 

) 
+0

這是我最初的 - 是的,它會工作,但它需要我輸入given_id – aggietech 2011-04-27 18:31:31

+0

對不起..我編輯過這個。 – Prabhjot 2011-04-27 18:33:03

+1

@aggie - 我不明白你的意思是「它需要我輸入given_id」。你在問題中的例子表明這是你需要做的事情? – 2011-04-27 18:36:47

2
WITH T 
    AS (SELECT ID, 
       AttributeID, 
       AttributeValue, 
       Version, 
       row_number() over (PARTITION BY id ORDER BY version DESC) AS rn 
     FROM your_table 
     WHERE AttributeID=1) 
SELECT ID, 
     AttributeID, 
     AttributeValue, 
     Version 
FROM T 
WHERE rn = 1; 
+0

嗯,不知道我明白了attributeid的相關性。 – 2011-04-27 18:34:24

+0

在這種情況下...我的對象有幾個不同的屬性,每個屬性都附帶一個版本,我試圖查詢obj中給定屬性的最新版本。 – aggietech 2011-04-27 18:37:05

+0

是的,這是對另一個答案,我扔了一下評論。我認爲這應該做你需要的。 – 2011-04-27 18:38:28

2
Select ... 
From EAV 
Where AttributeId = @AttributeId 
    And Version = (
        Select Max(E1.Version) 
        From EAV As E1 
        Where E1.Id = EAV.Id 
         And E1.AttributeId = EAV.AttributeId 
        )