MySQL在每个组中的最后一条记录,在同一日期有多条记录

时间:2018-04-02 17:43:35

标签: mysql sql

以下是样本数据

let operation = AsynchronousBlockOperation { [weak self] finalise in
   return session.dataTask(with: url) {
      ...
      finalise() // This will finish operation
   }
}

以下是预期输出

row_id  cust txn_dt       txn_amount
-------------------------------------
1       1    31-01-2018   3000
2       1    04-02-2018   4000
3       1    04-02-2018   6000
4       2    29-01-2018   2500
5       2    02-02-2018   3900
6       1    01-02-2018   5000
7       1    01-02-2018   3900

需要根据日期为每个客户选择最新记录,然后选择row_id

2 个答案:

答案 0 :(得分:1)

当有两列定义排序时,这很棘手。这是一种方法:

select t.*
from t
where t.row_id = (select t2.row_id
                  from t t2
                  where t2.cust = t.cust
                  order by t2.txn_date desc, row_id desc
                  limit 1
                 );

t(cust, txn_date, row_id)上的索引应该对性能有所帮助。

答案 1 :(得分:0)

这是一种返回指定结果的方法:

SELECT t.row_id
     , t.cust
     , t.txn_date
     , t.txn_amount
  FROM ( SELECT r.cust
              , MAX(r.row_id) AS max_row_id
           FROM ( SELECT p.cust
                       , DATE_FORMAT(
                           MAX( 
                             STR_TO_DATE( p.txn_date ,'%d-%m-%Y')
                           )
                         ,'%d-%m-%Y'
                         ) AS max_txn_date 
                    FROM sample_data p
                   GROUP BY p.cust
                ) q
           JOIN sample_data r
             ON r.cust     = q.cust
            AND r.txn_date = q.max_txn_date
          GROUP BY r.cust
       ) s
  JOIN sample_data t
    ON t.cust   = s.cust
   AND t.row_id = s.max_row_id
 ORDER BY t.row_id ASC

内联视图q获取每个txn_date的最新cust

内联视图s获取每个row_id的最新txn_date的最大cust

(如果txn_date列为DATE数据类型,我们可以避免STR_TO_DATEDATE_FORMAT函数的严重性。如果有适当的索引,我们会(可能) )避免全扫描和昂贵的“使用filesort”操作。)