How to make a SQL query for last transaction of every account?

前端 未结 4 931
心在旅途
心在旅途 2020-12-28 08:59

Say I have a table \"transactions\" that has columns \"acct_id\" \"trans_date\" and \"trans_type\" and I want to filter this table so that I have just the last transaction f

相关标签:
4条回答
  • 2020-12-28 09:11

    Try this

    WITH 
    LastTransaction AS
    (
        SELECT acct_id, max(trans_date) as trans_date  
        FROM transactions 
        GROUP BY acct_id
    ),
    AllTransactions AS
    (
        SELECT acct_id, trans_date, trans_type
        FROM transactions 
    )
    SELECT *
    FROM AllTransactions
    INNER JOIN LastTransaction
        ON AllTransactions.acct_id = LastTransaction.acct_id
        AND AllTransactions.trans_date  = LastTransaction.trans_date
    
    0 讨论(0)
  • 2020-12-28 09:12

    This works on SQL Server...

    SELECT acct_id, trans_date, trans_type
    FROM transactions a
    WHERE trans_date = (
       SELECT MAX( trans_date )
       FROM transactions b
       WHERE a.acct_id = b.acct_id
    )
    
    0 讨论(0)
  • 2020-12-28 09:33
    select t.acct_id, t.trans_type, tm.trans_date
    from transactions t
    inner join (
        SELECT acct_id, max(trans_date) as trans_date  
        FROM transactions 
        GROUP BY acct_id;
    ) tm on t.acct_id = tm.acct_id and t.trans_date = tm.trans_date
    
    0 讨论(0)
  • 2020-12-28 09:37

    This is an example of a greatest-n-per-group query. This question comes up several times per week on StackOverflow. In addition to the subquery solutions given by other folks, here's my preferred solution, which uses no subquery, GROUP BY, or CTE:

    SELECT t1.*
    FROM transactions t1
    LEFT OUTER JOIN transactions t2
      ON (t1.acct_id = t2.acct_id AND t1.trans_date < t2.trans_date)
    WHERE t2.acct_id IS NULL;
    

    In other words, return a row such that no other row exists with the same acct_id and a greater trans_date.

    This solution assumes that trans_date is unique for a given account, otherwise ties may occur and the query will return all tied rows. But this is true for all the solutions given by other folks too.

    I prefer this solution because I most often work on MySQL, which doesn't optimize GROUP BY very well. So this outer join solution usually proves to be better for performance.

    0 讨论(0)
提交回复
热议问题