MySQL查询选择每个客户的最大日期的最大时间值

时间:2018-03-06 17:57:30

标签: mysql sql max

我有一个名为Transaction的表用于客户交易,它包含:

CustomerID, 
Datetrans (transaction date)
Timetrans (transaction time)

我想返回max(Datetrans),因为客户每天可以进行两次交易;我想获得最大Datetrans日期的Timetrans的最大值。

我试过了:

SELECT CustomerID, MAX(Datetrans), MAX(Timetrans) FROM Transaction

它返回整个表中的所有时间最大时间值,而不是取决于最大日期。 我也尝试了一些连接(外部和内部),交替max(Datetrans)和max(Timetrans)并且由于某种原因它没有经历。 请帮助!

2 个答案:

答案 0 :(得分:0)

首先,您需要GROUP BY才能获得多行:

SELECT CustomerID, MAX(Datetrans), MAX(Timetrans)
FROM Transaction
GROUP BY CustomerId;

但我真正认为你想要的是最新的日期/时间组合。这是一种方法:

select t.*
from transaction t
where t.date = (select max(t2.date)
                from transaction t2
                where t2.customerid = t.customerid
               ) and
      t.time = (select max(t2.time)
                from transaction t3
                where t3.customerid = t.customerid and
                      t3.date = t.date
               );

还有其他方法。如果您存储了一个日期/时间值(并且可以将它们组合为max())或者MySQL具有窗口函数,那么这将更简单。另一种方法使用元组:

select t.*
from transaction t
where not exists (select 1
                  from transaction t2
                  where t2.customerid = t.customerid and
                        (t2.date, t2.time) > (t.date, t.time)
                 );

或:

select t.*
from transactions t
where (t.date, t.time) = (select t2.date, t2.time
                          from transaction t2
                          where t2.customerid = t.customerid
                          order by t2.date desc, t2.time desc
                          limit 1
                         );

答案 1 :(得分:0)

通过将两个单独的字段转换为单个时间戳字段,您可以使用一个更简单的查询来完成此操作。我对性能一无所知。

SELECT customerID, DATE(maxTime) as datetrans, TIME(maxTime) as timeTrans 
FROM (
    select customerID, max(Timestamp(dateTrans, timeTrans)) as maxTime
      from transactions
      group by customerID) as lastCustomerTrans

您需要外部查询的唯一原因是将时间戳转换回日期和时间。

Link to SQL fiddle