2016-07-07 4 views
-3

enter image description hereЯ хочу, чтобы сравнить строки в таблице и найти несовпадения

Я хочу, чтобы запрос, который может тянуть последнюю три строки со всеми столбцами и с другим столбцом, который определяет тип несовпадения т.е. учета, currency..etc.

Может ли кто-нибудь помочь мне в этом?

+3

Что вы пробовали до сих пор? Можете ли вы показать нам свою текущую попытку запроса и ожидаемый результат? – jarlh

+0

, пожалуйста, добавьте DDL для запросов. Проверьте здесь, как спросить: spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ – TheGameiswar

+0

SELECT gfd.ticker , gfd.segment, gfd.value1, gfd.value2, gfd.accounting, gfd.currency, gfd.multiplier (CASE WHEN gfd.ticker = gfd.ticker и gfd.segment = gfd.segment и gfd.value1 = gfd .value1 и gfd.value2 = gfd.value2 и gfd.accounting <> gfd.accounting и gfd.currency = gfd.currency и gfd.multiplier = gfd.multiplier THEN 'accounting_diff' END) AS 'mismatch_type', gfd.user FROM companies_financial_data gfd WHERE gfd.date_of_update BETWEEN '06/07/2016 'и '07/07/2016'; – Sasi

ответ

0

Не уверен, что именно то, что вы хотите, но есть взгляд на этот

/* 
drop table t 
create table T (ticker VARCHAR(1), accounting varchar(1), currency varchar(1), multiplier varchar(1), dte date) 
truncate table t 
INSERT INTO T VALUES 
('a','p','u','m','2016-06-06'), 
('a','p','u','m','2016-06-07'), 
('b','g','c','m','2016-06-07'), 
('c','p','u','b','2016-06-07') 

*/ 

select u.ticker,u.accounting,u.currency,u.multiplier, 
     concat(diff,',',diff2,',',diff3) as diffs   
from 
(
select t.*, 
     case when t.accounting <> t.a2 or t.accounting <> t.a3 then 'Accounting' else '' end as diff, 
     case when t.currency <> t.c2 or t.currency <> t.c3 then 'Currency' else '' end as diff2, 
     case when t.multiplier <> t.m2 or t.multiplier <> t.m3 then 'Multiplier' else '' end as diff3 

from 
(

select s.*, 
     case when s.rn = 1 then lead(s.accounting, 1,0) OVER (ORDER BY s.rn) 
      when s.rn = 2 then lag(s.accounting, 1,0) OVER (ORDER BY s.rn) 
      when s.rn = 3 then lag(s.accounting, 1,0) OVER (ORDER BY s.rn) 
     end as a2, 

     case when s.rn = 1 then lead(s.accounting, 2,0) OVER (ORDER BY s.rn) 
      when s.rn = 2 then lead(s.accounting, 1,0) OVER (ORDER BY s.rn) 
      when s.rn = 3 then lag(s.accounting, 2,0) OVER (ORDER BY s.rn) 
     end as a3, 

     case when s.rn = 1 then lead(s.currency, 1,0) OVER (ORDER BY s.rn) 
      when s.rn = 2 then lag(s.currency, 1,0) OVER (ORDER BY s.rn) 
      when s.rn = 3 then lag(s.currency, 1,0) OVER (ORDER BY s.rn) 
     end as c2, 

     case when s.rn = 1 then lead(s.currency, 2,0) OVER (ORDER BY s.rn) 
      when s.rn = 2 then lead(s.currency, 1,0) OVER (ORDER BY s.rn) 
      when s.rn = 3 then lag(s.currency, 2,0) OVER (ORDER BY s.rn) 
     end as c3, 

     case when s.rn = 1 then lead(s.multiplier, 1,0) OVER (ORDER BY s.rn) 
      when s.rn = 2 then lag(s.multiplier, 1,0) OVER (ORDER BY s.rn) 
      when s.rn = 3 then lag(s.multiplier, 1,0) OVER (ORDER BY s.rn) 
     end as m2, 

     case when s.rn = 1 then lead(s.multiplier, 2,0) OVER (ORDER BY s.rn) 
      when s.rn = 2 then lead(s.multiplier, 1,0) OVER (ORDER BY s.rn) 
      when s.rn = 3 then lag(s.multiplier, 2,0) OVER (ORDER BY s.rn) 
     end as m3 

from 
(
select top 3 
     row_number() over (order by dte) rn, 
     t.ticker,t.accounting,t.currency,t.multiplier 
from t 
where dte = (select max(dte) from t) 
) s 
--order by s.rn 
) t 
) u  
Смежные вопросы