Я називаю таблицю SavingsMaster
. Ось деякі зразки даних з нього:
LBrCode PrdAcctId ActToBalLcy
28 20060000000000020000000100000000 3010.78
і називається інша таблиця D010014
:
LBrCode PrdAcctId CblDate Balance3
28 20060000000000020000000100000000 4/28/2015 3010.78
28 20060000000000020000000100000000 4/7/2015 3000
Я хочу вибрати записи, де кінцевий баланс у D010014 (порядок за CblDate), які не відповідають SavingsMaster.
Будь-яка ідея про те, як це зробити?
Відповіді:
2 для відповіді № 1Ви можете використовувати row_number()
щоб отримати найновіший запис від d010014
. Тоді a left join
може використовуватися для відповідності запису. Далі повертаються рядки без збігів, навіть ті, у яких немає рядків d010014
:
select sm.*, d.Balance3
from SavingsMaster sm left join
(select d.*,
row_number() over (partition by lbrCode, PrdAcctId
order by CblDate desc) as seqnum
from d010014 d
) d
on d.lbrCode = sm.lbrCode and d.PrdAcctId = d.PrdAcctId and
d.seqnum = 1
where d.PrdAcctId is null or d.Balance3 <> sm.ActToBalLcy;
Примітка: це може не спрацювати, якщо залишки зберігаються як числа з плаваючою комою через помилки округлення. Замість <>
Ви можете використовувати:
abs(d.Balance3 - sm.ActToBalLcy) > 0.001 -- or some threshold like this
Крім того, це передбачає, що обидва lbrCode
і PrdAcctId
потрібні для узгодження таблиць. Якщо потрібен лише один, ви можете спростити запит, видаливши логіку для іншого.