2015-08-20 2 views
0

У меня есть таблица под названием SavingsMaster. Это некоторые примеры, данные из него:SQL Server compare

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 (OrderBy CblDate), которые не сопрягая с SavingsMaster.

Любая идея о том, как это сделать?

ответ

2

Вы можете использовать row_number(), чтобы получить самую последнюю запись от d010014. Затем для соответствия записи можно использовать 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 необходимы, чтобы соответствовать таблицам. Если требуется только один, вы можете упростить запрос, удалив логику для другого.

+0

Вы хотели сказать вместо d.Balance3 <> sm.ActToBalLcy Я могу использовать abs (d.Balance3 - sm.ActToBalLcy) <0.001? –

+0

@DeEDEe. , , Спасибо. Я исправил это утверждение. –

+0

вы не можете использовать row_number таким образом. Когда вы присоединяетесь к seqnum = 1, вы эллимируете строки из D010014, где balance3 и ActToBalLcy идентичны в последней строке, давая нуль вместо последней строки несоответствия –