如何获得“最顶层”的数据

时间:2012-11-06 16:22:37

标签: sql plsql oracle11g

我希望从类似的表格中获取“最顶层”数据:

A B C | Id
1 2 3 | 1
  4 5 | 1
    6 | 1

A-C =列
1-6个值(未设置的字段为空)
数据按顺序依次按降序顺序降序

当我查询我想获取最新的书面数据时,在这个例子中,查询应该在一行中给我1,4和6:

a b c | Id
1 4 6 | 1

这是我尝试的但是我得到了正确的结果但是在不同的行中:

select * from
( select id, a from dataTable where id=(select max(dt.dataRow) from dataTable dt where dt.id = 1)) a_query
full outer join
( select id, b from dataTable where id=(select max(dt.dataRow) from dataTable dt where dt.id = 1)) b_query
on a_query.id=b_query.id 
full outer join
( select id, c from dataTable where id=(select max(dt.dataRow) from dataTable dt where dt.id = 1)) c_query 
on nvl(a_query.id, b_query.id)=c_query.id

优先的Oracle SQL

2 个答案:

答案 0 :(得分:3)

这似乎过于复杂,只需获取每列的最大值(如果列的值为null,则使用COALESCE):

SELECT [id], MAX(COALESCE(a, 0)) AS a, 
    MAX(COALESCE(b, 0)) AS b, 
    MAX(COALESCE(c, 0)) AS c
FROM dataTable 
GROUP BY [id]

答案 1 :(得分:0)

我可能会稍微简化一下我的例子。 A,B,C中的数据可能是非数字的,不会排序等等。

我发现last_value()http://www.oracle.com/technetwork/issue-archive/2006/06-nov/o66asktom-099001.html非常适合返回:

A B C | Id
1 2 3 | 1
1 4 5 | 1
1 4 6 | 1

让我操作。

然后查询看起来像这样:

select distinct 
last_value(a ignore nulls) over (order by id) a,
last_value(b ignore nulls) over (order by id) b,
last_value(c ignore nulls) over (order by id) c
from datatable
where datatable.id IN (select id from datatable where datatable.id = 1)