0

同様のテーブルから「最上位」のデータを取得したい:

ABC | ID
1 2 3 | 1
  4 5 | 1
    6 | 1

AC=Columns
1-6 の値 (フィールドが設定されていない場合は空です)
データは ID の順序に従って降順です

クエリを実行すると、最新の書き込みデータを取得したいと思います。この例では、クエリは 1、4、および 6 を 1 行で返す必要があります。

abc | 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

それは非常に複雑に思えます。各列の最大値を取得するだけです (列の値が 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]
于 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が返されるこれに非常によく適合することがわかりました:

ABC | 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 に答える