Против хранимых процедур: бизнес-логика в программировании располагает с интервалами
, я помещаю высокое значение в питание выражения, и я не нахожу, что пространство SQL все это выразительное. Используйте лучшие инструменты, которые Вы имеете под рукой для самых соответствующих задач. Игра с понятиями логического и высшего порядка лучше всего сделана на высшем уровне. Следовательно, управление устройством хранения данных и данными большого объема лучше всего сделано на уровне сервера, вероятно, в хранимых процедурах.
, Но это зависит. Если у Вас есть несколько приложений, взаимодействующих с одним механизмом хранения, и Вы хотите удостовериться, что он поддерживает свою целостность и рабочий процесс, то необходимо разгрузить всю логику в сервер базы данных. Или, быть готовым справиться с параллельной разработкой в нескольких приложениях.
Это пример запроса наибольшее число n на группу . Этот вопрос возникает несколько раз в неделю на 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
.
Это работает на SQL Server ...
SELECT acct_id, trans_date, trans_type
FROM transactions a
WHERE trans_date = (
SELECT MAX( trans_date )
FROM transactions b
WHERE a.acct_id = b.acct_id
)
Попробуйте это
WITH
LastTransaction AS
(
SELECT acct_id, max(trans_date) as trans_date
FROM transactions
GROUP BY acct_id
),
AllTransactions AS
(
SELECT acct_id, trans_date, trans_type
FROM transactions
)
SELECT *
FROM AllTransactions
INNER JOIN AllTransactions
ON AllTransactions.acct_id = LastTransaction.acct_id
AND AllTransactions.trans_date = LastTransaction.trans_date
select t.acct_id, t.trans_type, tm.trans_date
from transactions t
inner join (
SELECT acct_id, max(trans_date) as trans_date
FROM transactions
GROUP BY acct_id;
) tm on t.acct_id = tm.acct_id and t.trans_date = tm.trans_date