2015-12-08 173 views
0

我与随时间而改变,但保留版本属性的列表工作,所以这里有一个粗略的想法,我们正在寻找什么(用ID是主键):SQL数据透视表值

ID ATTRIBUTENAME ATTRIBUTEVALUE     CREATED    MODIFIED   AttributeID 
--- ---------------- ------------------------------- ------------------ ------------------- --- 
100 DocName   Updated Document    10-JUL-15 08.40.12 10-JUL-15 08.40.12 06 
100 Category   Regulatory      10-JUL-15 08.40.12 10-JUL-15 08.40.12 05 
100 Owner   Jane Doe      10-JUL-15 08.40.12 10-JUL-15 08.40.12 04 
100 DocName   Test Document     10-JUL-15 08.40.12 10-JUL-15 01.10.30 03 
100 Category   Regulatory      10-JUL-15 08.40.12 10-JUL-15 01.10.30 02 
100 Owner   John Doe      10-JUL-15 08.40.12 10-JUL-15 01.10.30 01 

我想对DocName,Category和Owner做一个数据透视表,但只能选择最近的AttributeValue,其中Modified是max。 ID是该属性列表的主要查找。 AttributeID是数据库中该行的唯一GUID(已更改为int)。

我该如何创建这种格式的数据透视表?

ID DocName   Category Owner 
--- ---------------- ---------- -------- 
100 Updated Document Regulatory Jane Doe 

还有其他几百个我最终需要添加的属性名称,但这是一个简明的例子。我也愿意为此更快/更好的想法。

回答

1

一种选择是使用条件与聚集rank()

select id, 
    max(case when attributename = 'DocName' then attributevalue end) docname, 
    max(case when attributename = 'Category' then attributevalue end) Category, 
    max(case when attributename = 'Owner' then attributevalue end) Owner 
from (
    select *, rank() over (partition by id order by modified desc) rn 
    from yourtable) t 
where rn = 1 
group by id 
+0

这似乎并不与PL/SQL的Oracle 11g的工作。在Rank()之前,我收到有关FROM语句未出现在“SELECT *”后的预期位置的错误。 – Taylor

+0

想通了 - 它不喜欢select *,但那很好 - 我只需要少量的列而不是所有的东西。干杯! – Taylor