Как сделать SQL-запрос для последней транзакции каждой учетной записи?

Против хранимых процедур: бизнес-логика в программировании располагает с интервалами

, я помещаю высокое значение в питание выражения, и я не нахожу, что пространство SQL все это выразительное. Используйте лучшие инструменты, которые Вы имеете под рукой для самых соответствующих задач. Игра с понятиями логического и высшего порядка лучше всего сделана на высшем уровне. Следовательно, управление устройством хранения данных и данными большого объема лучше всего сделано на уровне сервера, вероятно, в хранимых процедурах.

, Но это зависит. Если у Вас есть несколько приложений, взаимодействующих с одним механизмом хранения, и Вы хотите удостовериться, что он поддерживает свою целостность и рабочий процесс, то необходимо разгрузить всю логику в сервер базы данных. Или, быть готовым справиться с параллельной разработкой в нескольких приложениях.

13
задан Bill Karwin 1 October 2009 в 18:19
поделиться

4 ответа

Это пример запроса наибольшее число 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 .

24
ответ дан 1 December 2019 в 19:08
поделиться

Это работает на 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
)
11
ответ дан 1 December 2019 в 19:08
поделиться

Попробуйте это

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
2
ответ дан 1 December 2019 в 19:08
поделиться
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
1
ответ дан 1 December 2019 в 19:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: