gpt4 book ai didi

sql-server - SQL 服务器 : query to compare records in a single table and return those that don't match

转载 作者:行者123 更新时间:2023-12-03 16:45:56 24 4
gpt4 key购买 nike

我目前正在使用 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

如有任何帮助,我们将不胜感激!

这是我的第一篇文章,如果格式有误,请见谅...

最佳答案

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

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 子句中轻松调整。添加的两列 GroupingNameGroupingDate 的主要目的是将相关行保持在一起并按特定顺序排列(昨天的行后面是今天的行)。

您可以体验查询 at SQL Fiddle 的现场演示.

关于sql-server - SQL 服务器 : query to compare records in a single table and return those that don't match,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18122844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com