3

我目前正在使用 SSIS 来查询数据库,并将每晚来自同一查询的记录返回到另一个带有日期戳的数据库中的表中。我希望能够使用 SSRS / SQL 查询将昨天的记录与今天从查询返回的记录进行比较,并返回任何不匹配的记录。

这将包括:

  • 新增内容(新行)
  • 新删除(昨天存在但今天不存在的行)
  • 昨天和今天之间可能发生变化的任何列

表中数据示例如下:

SERVERNAME    CPUs    RAM    DISK    DATE  
==========    ====    ===    ====    ====  
Server1        1       2      20     8/8/2013  
Server2        2       4      40     8/8/2013  
Server3        2       4      40     8/8/2013  
Server1        1       2      20     9/8/2013  
Server3        2       6      40     9/8/2013  

查询比较差异将返回(或任何类似的) - 我什至不介意返回 3 个表来满足添加/删除/更改:

SERVERNAME    CPUs    RAM    DISK    DATE  
==========    ====    ===    ====    ====  
Server2        2       4      40     8/8/2013  
NULL           NULL    NULL   NULL   9/8/2013  
Server3        2       4      40     8/8/2013  
Server3        2       6      40     9/8/2013  

任何帮助将不胜感激!

这是我的第一篇文章,如果格式混乱,请道歉......

4

2 回答 2

1

假设每个日期不能有重复的服务器名称,您可以尝试以下操作:

WITH allservers AS (
  SELECT DISTINCT SERVERNAME AS GroupingName
  FROM YourTable
  WHERE DATE IN (@yesterday, @today)
)
SELECT s.GroupingName, x.*
FROM allservers AS s
LEFT JOIN YourTable AS y ON s.GroupingName = y.SERVERNAME AND y.DATE = @yesterday
LEFT JOIN YourTable AS t ON s.GroupingName = t.SERVERNAME AND t.DATE = @today
CROSS APPLY (
  SELECT @yesterday AS GroupingDate, y.*
  UNION ALL
  SELECT @today     AS GroupingDate, t.*
) x
WHERE EXISTS (
  SELECT y.CPUs, y.RAM, y.DISK
  EXCEPT
  SELECT t.CPUs, t.RAM, t.DISK
)
ORDER BY s.GroupingName, x.GroupingDate;

此查询产生的输出与您的不完全匹配,但可以在主 SELECT 子句中轻松调整。GroupingName添加和的两列的主要目的GroupingDate是将相关行保持在一起并按特定顺序(昨天的行,然后是今天的行)。

您可以在 SQL Fiddle上进行查询的现场演示。

于 2013-08-08T18:56:31.063 回答
0

您可以使用EXCEPT 和 INTERSECT t-sql 命令来查找行集之间的差异

这是使用它的示例:

declare @foo as table (foo int)
declare @foo2 as table (foo int)

insert into @foo values(1),(2),(5)
insert into @foo2 values(1),(2),(4)

select * from @foo
union
select * from @foo2
except
select * from @foo
intersect
select * from @foo2

此查询将找到第一个表中不存在于第二个表中的所有记录以及存在于第二个表中但不存在于第一个表中的所有记录(它的工作方式类似于“NOT INTERSECT”)

于 2013-08-08T10:23:58.033 回答