2016-02-23 20 views
5

Sono bloccato in un requisito. Potrebbe essere semplice ma non riesco a passare.È necessario selezionare gli ultimi 5 record tra le partizioni

Ho una tabella di controllo Audit_Info che cattura le informazioni di controllo di tutte le tabelle. Una tabella può essere eseguita più volte nella stessa data di business. Il mio requisito è di ottenere l'ultimo record della data aziendale per ogni mese fino agli ultimi 5 mesi. Può accadere che per un mese in particolare il tavolo non sia stato eseguito.

Table è come

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 

Analogamente ci sono altre tabelle in questo. Ne ho bisogno per 5 tavoli.

Grazie per il vostro aiuto.

saluti, Amit Please see the highlighted

risposta

3

In base al risultato atteso questo dovrebbe essere vicino:

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, se ho capito bene è possibile utilizzare row_number() con una certa data l'aritmetica:

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

requisito OP è l'ultimo ** business_date ** (non load_timestamp). Inoltre ... 'dove timestamp> = timestamp corrente ...': 'timestamp' non è una colonna e' timestamp corrente' (con lo spazio) non è corretto. – mauro

+0

Grazie Gordon, Scusate se la mia desc è stata fuorviante. Si prega di trovare l'allegato – user3901666

+0

Grazie a tutti per la vostra risposta Grazie Dieter ..got risultato atteso .. :) – user3901666

1

Se ho capito bene, si desidera che la data più al mese per il 5 negli ultimi mesi per i quali hai dati. Se è così, il gruppo per anno e mese e utilizzare la funzione max per selezionare la data più al mese:

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

Grazie Fuzzy, Siamo spiacenti, se la mia desc era fuorviante. Si prega di trovare l'allegato. – user3901666

Problemi correlati