/ / SQL Server порівняння - sql, sql-сервер

Порівняйте SQL Server - sql, sql-сервер

Я називаю таблицю 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 потрібні для узгодження таблиць. Якщо потрібен лише один, ви можете спростити запит, видаливши логіку для іншого.