SQL数据透视表值
问题描述:
我与随时间而改变,但保留版本属性的列表工作,所以这里有一个粗略的想法,我们正在寻找什么(用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
还有其他几百个我最终需要添加的属性名称,但这是一个简明的例子。我也愿意为此更快/更好的想法。
答
一种选择是使用条件与聚集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
这似乎并不与PL/SQL的Oracle 11g的工作。在Rank()之前,我收到有关FROM语句未出现在“SELECT *”后的预期位置的错误。 – Taylor
想通了 - 它不喜欢select *,但那很好 - 我只需要少量的列而不是所有的东西。干杯! – Taylor