У меня есть таблица под названием " Transaction
для транзакций с клиентом", она содержит:
CustomerID,
Datetrans (transaction date)
Timetrans (transaction time)
Я хотел бы вернуть max (Datetrans), учитывая, что клиент может совершать две транзакции в день; Я хочу получить максимальное значение Timetrans для этой максимальной даты Datetrans.
Я пытался:
SELECT CustomerID, MAX(Datetrans), MAX(Timetrans) FROM Transaction
Он возвращает значение максимального времени всего времени из всей таблицы, не зависящее от максимальной даты. Я также пробовал некоторые соединения (внешние и внутренние), чередующиеся max (Datetrans) и max (Timetrans), и по какой-то причине он не прошел. ПОЖАЛУЙСТА ПОМОГИ!
Во-первых, вам понадобится 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
);
Вы можете сделать это с помощью простого простого запроса, преобразовывая два отдельных поля в одно временное поле. Однако я ничего не знаю о производительности.
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
Единственная причина, по которой вам нужен внешний запрос, - это преобразовать метку времени в дату и время.