2016-07-31 22 views
0

Ich habe eine Abfrage, die wie folgt aussehen:von max id in max Datum

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

die Abfrage eine Liste von Entitäten, die von ihrer ID. wie (es spielt eigentlich keine Rolle):

neben diesem, ich habe auch Tabelle, die drei Spalten enthalten:

Sequenz Einheit (von oben) value_date (Format: TT/MM/JJJJ) Das Valutadatum ist nicht für alle Entitäten gleich.

Zum Beispiel sehen die Tabelle wie folgt aus:

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 

ich für jede Entität ausgeführt werden müssen (aus der Abfrage, da die Tabelle halten, auch für mich irrelevant Einheiten), und wählen Sie die max-Sequenz mit der max value_date für die Entitäten. (Mit anderen Worten, find für jede Entität das max value_date und innerhalb dessen die max seq).

Das Ergebnis muss sein, Liste mit 3 Spalten: seq, entity, value_date. Wie kann ich es tun?

Ich hoffe meine Frage ist klar.

Antwort

1

Sie können mit Blick besser dran, und Verbindungs zu dieser Ansicht, besonders wenn Sie diese Logik (höchstes Datum, höchste Seq für jede Entität) mehr als einmal benötigen.

create view (...viewname...) - der SELECT-Teil wie folgt:

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; 

Dann:

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

Von Ihrem Beitrag Re-Lektüre, so scheint es, alles, was Sie wirklich der select Teil der View-Definition erforderlich war - benutze es wie du willst.

Ich war mir nicht sicher, als Sie sagten Value_Date ist im Format TT/MM/JJJJ - das scheint zu implizieren, es ist in VARCHAR2 oder einem anderen ähnlichen String-Format, kein aktuelles Datum. In diesem Fall ist es am besten, die Datenstruktur zu reparieren und den Datumsdatentyp zu erstellen. Andernfalls müssen Sie to_date(value_date, 'dd/mm/yyyy') anstatt einfach value_date verwenden.

+0

vielleicht ... ich werde darüber nachdenken. –

+0

Das value_date ist im Datumsformat. (value_date ist nur der Name der Spalte) –

1

Hmmm. Hier ist eine Methode, die nicht Aggregation erfordert:

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; 

Wenn Sie das Datum als auch benötigen, können Sie, dass mehr leicht zu bekommen:

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

wow ... schöne und elegante Art und Weise. Vielen Dank. –