繁体   English   中英

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

[英]MySQL last record in each group with multiple records in same date

以下是样本数据

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  cust txn_dt       txn_amount
-------------------------------------
3       1    04-02-2018   6000
5       2    02-02-2018   3900

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

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

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)的索引应该对性能有所帮助。

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

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函数的STR_TO_DATE 。如果有适当的索引可用,我们(可能)将避免完全扫描和昂贵的“使用文件排序”操作。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM