2016-02-23 13 views
5

Ich bin in einer Anforderung stecken. Es könnte einfach sein, aber ich komme nicht durch.Müssen die letzten 5 Datensätze unter den Partitionen

Ich habe eine Audit-Tabelle Audit_Info, die die Audit-Informationen aller Tabellen erfasst. Eine Tabelle könnte mehrmals am selben Geschäftsdatum ausgeführt werden. Meine Anforderung ist, den letzten Geschäftsdatensatz für jeden Monat bis zu den letzten 5 Monaten zu erhalten. Es kann vorkommen, dass die Tabelle für einen bestimmten Monat nicht ausgeführt wurde.

Tabelle ist wie

table_name business_date src_rec tgt_rec del_rec load_timestamp 
abc   25/10/2015 10  10  0  23/01/2016 03:06:56 
abc   25/10/2015 10  10  0  23/01/2016 05:23:34 
abc   07/09/2015 10  10  0  23/10/2015 05:37:30 
abc   05/08/2015 10  10  0  23/09/2015 05:23:34 
abc   15/06/2015 10  10  0  23/07/2015 05:23:34 
abc   25/04/2015 10  10  0  23/05/2015 05:23:34 

Similary gibt es andere Tabellen in diesem. Ich brauche es für 5 Tische.

Danke für Ihre Hilfe.

Grüße, Amit Please see the highlighted

Antwort

3

Basierend auf Ihrem erwartetes Ergebnis so nah sein sollte:

select * from tab 
where -- last five months 
    business_date >= add_months(trunc(current_date),-5) 
qualify 
    row_number() 
    over (partition by trunc(business_date) -- every month 
     order by business_date desc, load_timestamp desc) -- latest date 
1

Hmmm, wenn ich das richtig kann man mit einem gewissen Datum Arithmetik row_number() verstehen:

select ai.* 
from (select ai.*, 
      row_number() over (partition by table_name, extract(year from business_date), extract(month from business_date) 
           order by business_date desc 
           ) as seqnum 
     from audit_info ai 
     where timestamp >= current timestamp - interval '5' month 
    ) ai 
where seqnum = 1; 
+0

OP Anforderung auf den neueste ist ** business_date ** (nicht load_timestamp). Auch ... 'where timestamp> = aktueller timestamp ...': 'timestamp' ist keine Spalte und' aktueller timestamp' (mit Leerzeichen) ist nicht korrekt. – mauro

+0

Danke Gordon, Sorry, wenn mein desc irreführend war. Bitte finden Sie die beiliegende – user3901666

+0

Vielen Dank für Ihre Antwort Danke Dieter ..got erwartetes Ergebnis .. :) – user3901666

1

Wenn ich richtig verstehe, wollen Sie den größten Tag pro Monat für den 5 die letzten Monate, für die Sie Daten haben. Wenn ja, Gruppe nach Jahr und Monat und verwenden Sie die max Funktion den größten Tag pro Monat wählen:

select top 5 
    max(business_date), extract(year from business_date) , extract(month from business_date) 
from mytable 
group by extract(year from business_date), extract(month from business_date) 
order by extract(year from business_date) desc, extract(month from business_date) desc 
+0

Danke Fuzzy, Sorry, wenn mein desc irreführend war. Finden Sie das beiliegende. – user3901666

Verwandte Themen