SQL查询重复,自联接和计算字段

时间:2015-10-09 21:16:25

标签: sql-server tsql

我正在整理一份报告来跟踪SQL可用性组中的延迟。我需要找到两次之间的区别。我有server1,database1和time1。我需要将它与server2,database1和time2进行比较。数据存储在表中,新数据将附加到表中。我尝试创建的查询将获得这些新条目(字段Hardened_time_MS_Diff将为NULL),我需要获取主服务器和辅助服务器返回的时间之间的差异。以下是数据的示例:

Server_name  Database_name  Last_Hardened_Time
Server1      ABC            2015-10-08 10:10:05.180
Server2      ABC            2015-10-08 10:10:05.643

我获取Hardened_time_MS_Diff值的查询如下所示:

Select a1.server_name,  a1.database_name, 
Case when a1.Last_Hardened_Time >= a2.Last_Hardened_Time
       then
         DATEDIFF (MS, a2.Last_Hardened_Time, a1.Last_Hardened_Time)
       Else
         DATEDIFF (MS, a1.Last_Hardened_Time, a2.Last_Hardened_Time)
       End as Hardened  
   FROM [database].[dbo].[ag_latency] a1
           JOIN ag_latency a2
          ON a1.database_name = a2.database_name
    AND a1.server_name <> a2.server_name
          where a1.Hardened_time_MS_Diff is NULL

现在它正在返回一些疯狂的数字,并重复一遍。第一次运行它会正常工作。第二次运行我的数据看起来只适用于Last_Hardened_time没有改变的服务器。如果它改变了,我会得到第二批绝对庞大的数字:

Server_name  Database_name  Last_Hardened_Time       Hardened_time_MS_Diff
Server1      ABC            2015-10-09 12:00:05.013  26
Server2      ABC            2015-10-09 12:00:05.040  26
Server1      ABC            2015-10-09 12:15:07.843  -902803
Server2      ABC            2015-10-09 12:15:07.877  -902863

我怎样才能让它做我想做的事?

此外,获取数据的部分位于Powershell中,因此,如果有更简单的方法来操作PoSH中的数据表,然后将数据向下推,请告诉我。

提前致谢!

1 个答案:

答案 0 :(得分:0)

简单回答你的问题,当你有多对时间戳时,你的连接条款不会起作用 - 它不仅会加入row1-row2和row3-row4,还会加入row1-row4和row2-row3,后两者对你的报告没有意义。

一种可能的解决方案是消除任何大于阈值的时间差(比如1000 MilliSec,根据您的样本数据)。所以你的where子句看起来像

where a1.Hardened_time_MS_Diff is NULL AND (DATEDIFF (MS, a2.Last_Hardened_Time, a1.Last_Hardened_Time) < 1000 AND DATEDIFF (MS, a2.Last_Hardened_Time, a1.Last_Hardened_Time) > -1000)

另一种解决方案会更强大,但需要您更改表架构。您需要向表中添加一列,指出哪两行是配对的。例如,将1分配给前两行,将2分配给最后两行,然后通过此列连接表a1和a2。

Key  Server_name  Database_name  Last_Hardened_Time       Hardened_time_MS_Diff
1    Server1      ABC            2015-10-09 12:00:05.013  26
1    Server2      ABC            2015-10-09 12:00:05.040  26
2    Server1      ABC            2015-10-09 12:15:07.843  -902803
2    Server2      ABC            2015-10-09 12:15:07.877  -902863

对于powershell部分,您能否详细说明您需要什么?

亨利