0

各行の3つの列を比較し、これらの列からMAXデータを取得する必要があります。私のサンプルデータは次のとおりです。

create table sept18 ( t1 number, t2 number, t3 number );

insert all
  into sept18 values (1,2,3)
  into sept18 values (-1,-2,3)
  into sept18 values (1,null,13)
  into sept18 values (-1,-2,-3)
  into sept18 values (-1,0,0)
select * from dual;

私の操作では、3つの列と、各行の最大値を持つフィールドが表示されます。たとえば、1行目と2行目は3、3行目は13、4行目は-1、5行目は0です。

どうすればこれを達成できますか?パーティションを使用する必要がありますか?

4

1 に答える 1

3

いいえ、分析クエリを使用する必要はありません(これがパーティションの意味だと思いますか?)。分析関数は、いくつかの説明の総量を計算するために使用されます。列全体で何かを集約することは考えていません。の最大値を見つけたい。

このためにはgreatest()、の反対の関数を使用する必要がありleast()ます。

select a.*, greatest(t1, t2, t3)
  from sept18 a

警告してください。単一の列がnullの場合、これらの関数は両方ともnullを返します。これにどのように対処するかはあなたの決定です。私の通常の戦術はnvl()、完全にばかげた値で使用することです。選択した「ばかげた」値が正しくなる可能性があるため、これは危険な場合があります。データを確実に理解してください。

select a.*, greatest(nvl(t1,-9999), nvl(t2, -9999), nvl(t3, -9999))
  from sept18 a

両方のクエリを示すための小さなSQLフィドルを次に示します。

すべての列がnullの場合は、さらにばかげたことに陥ることがあります。する必要がありますnullif()greatest()または、もっと簡単に言うと、WHEREを使用して、すべての列がnullである行を除外します。

少し余分なポイント。テーブルの存在はsept18少し疑わしいようです。実際に1日に1つのテーブルがある場合は、データベースを正規化し、たとえば、列を持つ一時テーブルcreated_dateを作成することを検討する必要があります。

于 2012-09-18T21:01:31.447 に答える