Ниже приведены примеры данных
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
Это сложно, когда есть два столбца, которые определяют порядок. Вот один из способов:
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)
должен немного помочь производительности.
limit 1
?
Вот такой подход, который вернет указанный результат:
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
. И с подходящим индексом мы могли бы (вероятно) избежать полного сканирования и дорогостоящей операции "Использование файлового управления".)