MySQL запрос для выбора максимального значения времени для максимальной даты для каждого клиента

0

У меня есть таблица под названием " Transaction для транзакций с клиентом", она содержит:

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

Я хотел бы вернуть max (Datetrans), учитывая, что клиент может совершать две транзакции в день; Я хочу получить максимальное значение Timetrans для этой максимальной даты Datetrans.

Я пытался:

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

Он возвращает значение максимального времени всего времени из всей таблицы, не зависящее от максимальной даты. Я также пробовал некоторые соединения (внешние и внутренние), чередующиеся max (Datetrans) и max (Timetrans), и по какой-то причине он не прошел. ПОЖАЛУЙСТА ПОМОГИ!

  • 1
    обновите свой вопрос, добавьте правильный образец данных и ожидаемый результат
  • 0
    Храните даты и время как единое целое
Теги:
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
    Спасибо Гордон. Я использовал группу по заявлению, не беспокойтесь, ха-ха. Я нахожу самый первый ответ настолько простым и очень эффективным; и это правда, что я не продумал твой способ сделать это. Спасибо за ваше драгоценное время, чтобы дать ответ на мой вопрос.
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

Единственная причина, по которой вам нужен внешний запрос, - это преобразовать метку времени в дату и время.

Ссылка на скрипт SQL

  • 0
    Это потрясающе. Большое спасибо, сэр. Я только что провел 48 часов, пытаясь понять это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню