2011-04-27 135 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 
        )