Это пример запроса great-n-per-group . Этот вопрос возникает несколько раз в неделю на StackOverflow. В дополнение к решениям подзапросов, предоставленным другими людьми, вот мое предпочтительное решение, которое не использует подзапрос, GROUP BY
или CTE:
SELECT t1.*
FROM transactions t1
LEFT OUTER JOIN transactions t2
ON (t1.acct_id = t2.acct_id AND t1.trans_date < t2.trans_date)
WHERE t2.acct_id IS NULL;
Другими словами, вернуть строку так, чтобы не было другой строки с таким же acct_id
и большим trans_date
.
В этом решении предполагается, что trans_date
является уникальным для данной учетной записи, в противном случае могут возникнуть связи, и запрос вернет все связанные строки. Но это верно и для всех решений, данных другими людьми.
Я предпочитаю это решение, потому что я чаще всего работаю над MySQL, который не очень хорошо оптимизирует GROUP BY
. Таким образом, это решение для внешнего соединения обычно оказывается лучше для производительности.