2016-07-31 9 views
0

を選択:クエリは、そのIDでエンティティのリストを返す私はこのようになりクエリ持っている最大の日付に最大idで

with t as ( 
      ****** complex query from several joining tables ***** 
     ) 
select * from t; 

を。 (それは本当に重要ではありません)のような :

シーケンス エンティティ(:

この横に

は、私はまた、3列が含まれているテーブルを持っていますvalue_date(形式:dd/mm/yyyy) 値の日付はすべてのエンティティで同じではありません。例えば

、テーブルにはそのようになります。

seq   entity  value_date 
---------- ---------- ---------- 
1580   12001   31/05/2016 
1579   12001   30/06/2016 
1578   15003   30/06/2016 
1577   12001   30/06/2016 
1576   15003   30/06/2016 
1575   15003   30/06/2016 
1574   12004   30/06/2016 
1573   15003   31/05/2016 
1572   12004   31/05/2016 
1571   67677   30/04/2016 

は、私は(表には、私のために無関係なエンティティを保持しているため、クエリから)各エンティティのために実行する必要があり、かつで最大のシーケンスを選択エンティティのmax value_date。 (言い換えれば、各エンティティごとにmax value_dateを探し、その中で最大seqを探します)。

結果は、seq、entity、value_dateの3つの列でリストする必要があります。 どうすればいいですか?

私の質問がはっきりしていることを願っています。

答えて

1

をあなたは眺めのほうが良いと参加もここで凝集を必要としない方法がありますこのビューには、特に、このロジックが必要な場合(各エンティティの最高日付と最高seqを選択する)、複数回使用する必要があります。

create view (...viewname...) - SELECT一部以下のように:

select seq, entity, value_date 
from (
      select seq, entity, value_date, 
       row_number() over 
          (partition by entity order by value_date desc, seq desc) as rn 
      from t2 
     ) 
where rn = 1; 

その後:

with t as (...) 
select t.*, v.seq, v.value_date 
from t inner join viewname v 
     on t.entity = v.entity 

あなたのポストを再度読んでから、あなたが本当に必要なすべてのビュー定義のselect一部だったようです - 必要な方法で使用してください。

value_dateがdd/mm/yyyyの形式であるとはわかりませんでした。実際の日付ではなく、VARCHAR2または他の同様の文字列形式であると考えられます。その場合、あなたの最善の選択肢は、あなたのデータ構造を修正し、日付データ型にすることです。それ以外の場合は、単にvalue_dateの代わりにto_date(value_date, 'dd/mm/yyyy')を使用する必要があります。

+0

多分...私はそれを考慮する。 –

+0

value_dateは日付形式です。 (value_dateは単に列の名前です) –

1

Hmmm。

with t as ( 
      ****** complex query from several joining tables ***** 
    ) 
select t.*, 
     (select max(t2.seq) keep (dense_rank first order by date desc) 
     from t2 
     where t2.entity = t.entity 
     ) as max_seq 
from t; 

あなたにも日付が必要な場合は、そのより簡単に得ることができます:

select t.*, 
     (select max(t2.seq) keep (dense_rank first order by t2.date desc) 
     from t2 
     where t2.entity = t.entity 
     ) as max_seq, 
     (select max(t2.date) 
     from t2 
     where t2.entity = t.entity 
     ) as max_date 
from t; 
+0

うわー...いい&エレガントな方法。ありがとうございました。 –

関連する問題