2014-10-29 5 views
0

У меня есть MS SQL QuerySELECT 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' рядом с Version вместо Date_of_Record? – IronMan84

+0

@ IronMan84 Я получаю 'Неправильный синтаксис ...' – Glowie

+1

@ IronMan84 Невозможно. 'DISTINCT' применяется ко всей строке, а не к отдельным столбцам. –

ответ

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

+0

@ Glowie - четыре записи для той же Agent_Version ?? –

+0

Существуют разные версии агентов, но не отображаются записи, которые я ищу. Выведет ли вывод в OP – Glowie

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 ... 

группа по п будет агрегировать строки для каждой комбинации имя_компьютера, IP_Address, Agent_Version, mac_address. MIN (Date_of_Record) рассчитает для каждой группы самую раннюю дату.

+0

Великие умы думают одинаково! – AWinkle

+0

Я получаю сообщение об ошибке 'Column SEP_Versions.dbo.Computers.Date_of_Record недействителен в предложении ORDER BY, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. Когда я добавляю' Date_of_Record' в 'GROUP BY' I получить тот же результат, что и оригинал. Какие еще функции AGGREGATE существуют? – Glowie

+0

@ 1010 См. OP – Glowie

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

+0

Я получаю сообщение об ошибке 'Column SEP_Versions.dbo.Computers.Date_of_Record недействителен в предложении ORDER BY, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. Когда я добавляю' Date_of_Record 'to' GROUP BY' Я получаю тот же результат, что и оригинал. Какие еще функции AGGREGATE существуют? – Glowie

+0

@AWinkle Пожалуйста, смотрите OP – Glowie

Смежные вопросы