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

问题描述 投票:0回答:2

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

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

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

我试过了 :

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

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

mysql sql max
2个回答
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
                         );

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

© www.soinside.com 2019 - 2024. All rights reserved.