#sql #join #subquery
Вопрос:
Мне нужно несколько раз присоединяться к одному и тому же столу, но это выглядит некрасиво. Любые предложения приветствуются. Ниже приведен упрощенный SQL, у меня есть 8 таблиц в подзапросе, и он создает множество повторяющихся записей одной и той же даты, поэтому мне нужно найти только самую новую запись для каждого клиента. (Я не думаю, что БД и/или версия должны иметь значение, но я использую DB2 11.1 LUW)
select c.client_num, a.eff_date, t.trx_date
from client c
join address a on(a.id = c.addr_id)
join transaction t on(t.addr_id = a.id)
{many other joins}
where {many conditions};
select SQ.*
from [ABOVE_SUBQUERY] SQ
join
(select client_num, max(eff_date) AS newest_date from [ABOVE_SUBQUERY] group by client_num) AA
ON(SQ.client_num = AA.client_num and SQ.eff_date = AA.newest_date)
join
(select client_num, max(trx_date) AS newest_date from [ABOVE_SUBQUERY] group by client_num) TT
ON(SQ.client_num = TT.client_num and SQ.trx_date = TT.newest_date)
Комментарии:
1. Спасибо @Gordon Linoff, это хорошо сработало. Принял ответ, но он не позволит мне проголосовать.
Ответ №1:
Мне нужно штрафовать только самую новую запись для каждого клиента.
Разве ты не можешь просто использовать row_number()
?
select t.*
from (select t.*,
row_number() over (partition by client_num order by eff_date desc, eff_time desc) as seqnum
from <whatever> t
) t
where seqnum = 1;
Комментарии:
1.
APPLY
Операция также может сработать, и если ни одна из них не поможет, CTE-это то, что непосредственно отвечает на вопрос.2. Спасибо, Джоэл, я изучил Общие табличные выражения (CTE), и это более правильно ответило бы на мой вопрос. Но (как бы мне не нравились альтернативы в качестве ответов) рекомендация row_number() устранила мою потребность в этом.