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

0

Ниже приведены примеры данных

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

  • 0
    Можете ли вы показать, что вы пытались
  • 0
    Сохраните даты как даты (если вы еще этого не делаете)
Показать ещё 3 комментария
Теги:

2 ответа

1

Это сложно, когда есть два столбца, которые определяют порядок. Вот один из способов:

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) должен немного помочь производительности.

  • 2
    Забыли limit 1 ?
  • 0
    <code> выберите t. * из customer_accounting t, где t.row_id = (выберите t2.row_id из customer_accounting t2, где t2.customer_id = t.customer_id порядка по str_to_date (t2.txn_dt, '% d-% m-% Y') desc, t2.row_id desc); <code> Это просто возвращает OK и никаких результатов
Показать ещё 4 комментария
0

Вот такой подход, который вернет указанный результат:

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

inline view s получает максимальное значение row_id для последнего txn_date для каждого cust

(Если столбец txn_date был txn_date данных DATE, мы могли бы избежать rigmarole функций STR_TO_DATE и DATE_FORMAT. И с подходящим индексом мы могли бы (вероятно) избежать полного сканирования и дорогостоящей операции "Использование файлового управления".)

  • 0
    Это дало мне правильный вывод с наименьшим временем выполнения запроса всего 1,6 сек.

Ещё вопросы

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