0

我想从类似的表中获取“最重要”的数据:

美国广播公司 | ID
1 2 3 | 1
  4 5 | 1
    6 | 1

AC=Columns
1-6 values (未设置的字段为空)
数据按id降序排列

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

美国广播公司 | 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

4

2 回答 2

3

这似乎过于复杂,只需获取每列的最大值(并在列的空值的情况下使用 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]
于 2012-11-06T16:26:13.517 回答
0

我可能已经稍微简化了我的例子。A、B、C 中的数据可能是非数字且未排序的,依此类推。

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

美国广播公司 | 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) 
于 2012-11-07T13:40:38.983 回答