2014-10-29 140 views
0

我有一个MS SQL查询SELECT DISTINCT

SELECT DISTINCT Date_of_Record, Computer_Name, IP_Address, Agent_Version, Mac_Address 
FROM [SEP_Versions].dbo.Computers 
WHERE Computer_Name in (SELECT Computer_Name 
         FROM [SEP_Versions].dbo.Computers 
         GROUP BY Computer_Name 
         HAVING COUNT(DISTINCT Agent_Version) > 1) 
AND [SEP_Versions].dbo.Computers.COMPUTER_NAME LIKE '%s001' 
AND [SEP_Versions].dbo.Computers.IP_Address LIKE '%.100' 
ORDER BY Computer_Name, Date_of_Record 

输出

Date  Computer IP    Version   Mac 
2014-10-24 COMP001 10.10.10.10  12.1.3001.165 NULL 
2014-10-25 COMP001 10.10.10.10  12.1.3001.165 NULL 
2014-10-26 COMP001 10.10.10.10  12.1.3001.165 NULL 
2014-10-27 COMP001 10.10.10.10  12.1.4013.4013 NULL 
2014-10-28 COMP001 10.10.10.10  12.1.4013.4013 NULL 
2014-10-29 COMP001 10.10.10.10  12.1.5773.2276 NULL 

如何改变SELECT DISTINCT语句,因此它最早输出具有鲜明版本记录日期,即

Date  Computer IP    Version   Mac 
2014-10-24 COMP001 10.10.10.10  12.1.3001.165 NULL 
2014-10-27 COMP001 10.10.10.10  12.1.4013.4013 NULL 
2014-10-29 COMP001 10.10.10.10  12.1.5773.2276 NULL 

@Pradeep

您的解决方案输出

Date  Computer IP    Version   Mac 
2014-10-17 COMP001 10.10.10.10  12.1.3001.165 NULL 
2014-10-17 COMP002 10.10.10.11  12.1.4013.4013 NULL 
2014-10-17 COMP003 10.10.10.12  12.1.5773.2276 NULL 
2014-10-17 COMP004 10.10.10.14  11.0.5003.2276 NULL 

@ 1010和@AWinkle

如果我运行

SELECT DISTINCT Computer_Name, IP_Address, Agent_Version 
FROM dbo.Computers 
WHERE Computer_Name in (SELECT Computer_Name 
         FROM dbo.Computers 
         GROUP BY Computer_Name 
         HAVING COUNT(DISTINCT Agent_Version) > 1) 
AND dbo.Computers.COMPUTER_NAME LIKE '%s001' 
AND dbo.Computers.IP_Address LIKE '%.100' 
ORDER BY Computer_Name 

然后我得到

Computer IP    Version   Mac 
COMP001 10.10.10.10  12.1.3001.165 NULL 
COMP001 10.10.10.10  12.1.4013.4013 NULL 
COMP001 10.10.10.10  12.1.5773.2276 NULL 

如何修改SQL语句,所以它增加了相应Date_of_Record

+0

当您将'DISTINCT'关键字放在版本而不是Date_of_Record旁边时会发生什么? – IronMan84 2014-10-29 18:36:16

+0

@ IronMan84我得到'错误的语法......' – Glowie 2014-10-29 18:38:38

+1

@ IronMan84不可能。 “DISTINCT”适用于整行,而不适用于任何单独的列。 – 2014-10-29 18:40:43

回答

0

简单的答案是通过使用窗口函数。

;WITH cte 
    AS (SELECT DISTINCT Row_number() 
          OVER (
          partition BY Computer_Name,Agent_Version 
          ORDER BY Date_of_Record) RN, 
         Date_of_Record, 
         Computer_Name, 
         IP_Address, 
         Agent_Version, 
         Mac_Address 
     FROM [SEP_Versions].dbo.Computers 
     WHERE Computer_Name IN (SELECT Computer_Name 
            FROM [SEP_Versions].dbo.Computers 
            GROUP BY Computer_Name 
            HAVING Count(DISTINCT Agent_Version) > 1) 
       AND [SEP_Versions].dbo.Computers.COMPUTER_NAME LIKE '%s001' 
       AND [SEP_Versions].dbo.Computers.IP_Address LIKE '%.100') 
SELECT Date_of_Record, 
        Computer_Name, 
        IP_Address, 
        Agent_Version, 
        Mac_Address 
FROM cte 
WHERE RN = 1 
ORDER BY Computer_Name, 
      Date_of_Record 
+0

该查询返回我无法理解的数据。它返回同一日期的四条记录。 – Glowie 2014-10-30 13:04:36

+0

@Glowie - 同一个Agent_Version的四条记录? – 2014-10-30 13:11:24

+0

有不同的代理版本,但它不显示我正在查找的记录。将在OP – Glowie 2014-10-30 13:19:43

1

我觉得这是你想要

SELECT MIN(Date_of_Record), Computer_Name, IP_Address, Agent_Version, Mac_Address 
FROM ... 
WHERE ... 
GROUP BY Computer_Name, IP_Address, Agent_Version, Mac_Address 
ORDER BY ... 

group by子句将汇总行的计算机名,IP_ADDRESS AGENT_VERSION,MAC_ADDRESS的每个组合的东西。 MIN(Date_of_Record)将为每个组计算最早的日期。

+0

伟大的思想都一样! – AWinkle 2014-10-29 18:42:38

+0

我收到错误Column SEP_Versions.dbo.Computers.Date_of_Record在ORDER BY子句中无效,因为它不包含在聚合函数或GROUP BY子句中。当我将'Date_of_Record'添加到'GROUP BY'I时获得与原始相同的输出。还有什么其他的AGGREGATE功能? – Glowie 2014-10-30 12:56:22

+0

@ 1010请参阅OP – Glowie 2014-10-30 13:41:51

3

在SQL Server中,您不能仅通过选定数量的列来选择不同列,而需要对它们进行分组。使用MIN函数将在最早的日期提供不同的版本(通过计算机/ ip/mac)。

SELECT MIN(Date_of_Record) Earliest_Date_of_Record, Computer_Name, IP_Address, Agent_Version, Mac_Address 
FROM [SEP_Versions].dbo.Computers 
WHERE Computer_Name in (SELECT Computer_Name 
        FROM [SEP_Versions].dbo.Computers 
        GROUP BY Computer_Name 
        HAVING COUNT(DISTINCT Agent_Version) > 1) 
AND [SEP_Versions].dbo.Computers.COMPUTER_NAME LIKE '%s001' 
AND [SEP_Versions].dbo.Computers.IP_Address LIKE '%.100' 
GROUP BY Computer_Name, IP_Address, Agent_Version, Mac_Address 
ORDER BY Computer_Name, Date_of_Record 
+0

你是对的:) – 1010 2014-10-29 18:53:59

+0

我收到错误Column SEP_Versions.dbo.Computers.Date_of_Record在ORDER BY子句中无效,因为它不包含在聚合函数或GROUP BY子句中。当我添加Date_of_Record '到'GROUP BY'我得到与原始相同的输出。还有什么其他的AGGREGATE功能? – Glowie 2014-10-30 12:59:59

+0

@AWinkle请参阅OP – Glowie 2014-10-30 13:42:14