我有两个不同公司提供的数据表。我的主要目标是比较这两个表以检查是否存在任何差异(理想情况下所有数据应该相同)。
所以我的第一个表格格式如下:(只是示例)
companycode || BOOK || DATE || Amount ||
---------------------------------------------------------------------
abcd || DTCA || 06/02/2015 12:00:00 AM || 23679000
abcd || DTCA || 09/02/2015 12:00:00 AM || 23679000
abcd || DTCA || 10/02/2015 12:00:00 AM || 23679000
abcd || DTCA || 11/02/2015 12:00:00 AM || 23679000
abcd || DTCA || 12/02/2015 12:00:00 AM || 23679000
abcd || DTCA || 13/02/2015 12:00:00 AM || 23679000
abcd || DTCA || 16/02/2015 12:00:00 AM || 23679000
abcd || DTCA || 17/02/2015 12:00:00 AM || 23679000
---------------------------------------------------------------------
第一张表看起来像这样你只能看到差异是日期。每个工作日都要检查金额是否实际发生了变化。
我的第一个查询
select companycode, book, date, Amount from al_ext_impact_recon
第二张表
companycode || BOOK || DATE || Amount ||
---------------------------------------------------------------------
abcd || DTCA || 28/02/2015 12:00:00 AM || 23679000
abcd || DTCA || 15/03/2015 12:00:00 AM || 24679000
abcd || DTCA || 10/04/2015 12:00:00 AM || 25679000
abcd || DTCA || 12/05/2015 12:00:00 AM || 26679000
abcd || DTCA || 11/06/2015 12:00:00 AM || 27679000
abcd || DTCA || 13/07/2015 12:00:00 AM || 28679000
abcd || DTCA || 16/08/2015 12:00:00 AM || 29679000
abcd || DTCA || 17/09/2015 12:00:00 AM || 30679000
----------------------------------------------------------------------
第二张表,另一方面只在金额变化时保留记录。 因此日期不一致。
第二次查询
SELECT COALESCE (sx.a, ps.b) AS companycode,
pc.profit_centre_mnemonic AS book,
ps.intended_sd AS date,
SUM (ps.projected_position + ps.actual_position) AS amount
FROM ay ps
INNER JOIN al_profit_centre pc
ON ps.profit_centre_id = pc.profit_centre_id
LEFT OUTER JOIN al_raw_stock_xref sx
ON ps.stock_mnemonic = sx.stock_mnemonic
AND sx.stock_code_type = 'ISIN'
WHERE ps.position_type IN ('P', 'X')
GROUP BY COALESCE (sx.b, ps.a), pc.profit_centre_mnemonic, ps.intended_sd
ORDER BY 1, 2, 3
基本上我想要的只是检查第二个表的日期来进行比较。并做一些像Intersect这样的事情来看看差异。这样做的最佳方法是什么?
答案 0 :(得分:0)
看看这种方法。首先,我“重新设计”了您的第一个表,因此查询仅返回金额更改的记录。我使用分析LAG函数做到了这一点。现在两个表具有相同的逻辑和结构,您可以在它们上使用MINUS。
select * from onchangetable
minus
select * from (
select companycode, book, curdate, amount from (
select companycode, book, curdate, amount,lag(amount,1,0) over (order by curdate) as amount_prev
from alldaytable
) where amount!=amount_prev) ;
可能你需要两种方式做MINUS:onchangetable减去alldaytable,alldaytable数据减去onchangetable。
看看sql小提琴示例 http://sqlfiddle.com/#!4/5db65/1
答案 1 :(得分:0)
如果他们的时间段有一些重叠,那么你的两个示例表会好很多。但是,如果我理解正确,表1每天都有一个条目(周末减少),表2只有在金额变化时才有条目。
如果是这样,这个查询应该使表一看起来像表二:
select companycode, Book, Min( DATE ) as Date, Amount
from table1
group by companycode, Book, Amount;
现在使用任意数量的方法进行比较,例如MINUS或外连接在外场中寻找NULL。