带有更新值的SQL Pivot表

时间:2015-12-08 20:39:15

标签: sql oracle11g pivot

我正在处理随时间变化但仍保留版本的属性列表,因此我们大致了解我们正在查看的内容(ID为主键):

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是最大值。 ID是该属性列表的主要查找。 AttributeID是数据库中该行的唯一GUID(更改为int)。

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

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

我最终需要添加数百个其他属性名称,但这是一个简洁的示例。我也愿意接受更快/更好的想法。

1 个答案:

答案 0 :(得分: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