2014-10-29 145 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