Tuesday, June 10, 2014

How to select last updated transaction for every ID from a history table?

Here is the scenario:

You have multiple invoices in a table, with one record everytime the Invoice goes through a process, for example Invoice Created, Invoice Submitted, Invoice Approved etc. On top of that there could be multiple records for a step, for example an Invoice could be approved by multiple approvers, and that will end up being new records in the transaction history table.

If you need to create a report, that will show list of Invoices approved, and name of the last approver and the date, though could be tricky to get. After doing some research I found a simple way of determining that programatically:

We select the invoice along with timestamp of record, and sort them in descending order. We also select row_number for this query. The trick is to filter this result set where row_number is 1. Here is the exact sql if you need to refer:

Select  User_Id, approve_date,  Invoice_Id From (
 Select Sth.User_Id user_id, Sth.Timestamp approve_date, Swpv.Property_Value Invoice_Id,
  Row_Number() Over (Partition By Swpv.Property_Value Order By  To_Char(Sth.Timestamp,'DD-MON-YYYY HH24:MI:SS') Desc) R
  From Sf_Transition_History sth, Sf_Workitem_Property_Values_V swpv
Where Sth.Workitem_Instance_Id = swpv.Workitem_Instance_Id
   And Sth.Event_Name = 'Approved'
   And Swpv.Property_Name = 'InvoiceID'
)
Where R = 1