SQL Server Выбор самой новой записи для каждой строки - PullRequest
4 голосов
/ 23 июня 2011

У меня есть таблица SQL Server, подобная этой:

id(autoincrement)
hostname(varchar)
group(varchar)
member(varchar)
datequeried(varchar)

Таблица заполняется запланированным заданием, которое сканирует сеть для локальных членов группы администраторов ПК с Windows.

  • Сканирование по сети - похоже на то, что некоторые станции могут быть недоступны во время сканирования.

Запрос, который я хотел бы написать:

"select every hostname having the latest datequeried" 

Это для отображения новейших результатов (строк) каждого имени хоста, запрашиваемого в сети.

Понятно ли это?Я все еще сталкиваюсь с некоторыми проблемами синтаксиса, и я уверен, что это довольно легко.

Заранее спасибо.

Ответы [ 6 ]

2 голосов
/ 23 июня 2011

Если вы используете SQL SErver 2005 или новее (вы не указали ...), вы можете использовать CTE для этого:

;WITH MostCurrent AS
(
   SELECT
      id, hostname, group,
      member, datequeried,
      ROW_NUMBER() OVER(PARTITION BY hostname ORDER BY datequeried DESC) 'RowNum'
   FROM
      dbo.YourTable
) 
SELECT *
FROM MostCurrent
WHERE RowNum = 1

Внутренняя SELECT внутри CTE "разделяет" ваши данные на hostname, например каждый hostname получает новую «группу» данных и нумерует эти записи, начиная с 1 для каждой группы. Эти записи пронумерованы datequeried DESC, поэтому самая последняя запись имеет RowNum = 1 - для каждой группы данных (например, для каждой hostname).

1 голос
/ 25 июня 2011

Я могу отобразить требуемые результаты, используя:

   select hostname, member, max(lastdatequeried) 
   as lastdatequeried 
   from members
   group by hostname, member order by hostname

Спасибо всем, кто помог.

1 голос
/ 23 июня 2011

В SQL 2005 и более поздних версиях вы можете использовать ROW_NUMBER () следующим образом:

;WITH CTE AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY hostname ORDER BY datequeried DESC) AS RowNo
FROM YourTable
)

SELECT * FROM CTE WHERE RowNo = 1

"CTE" - это выражение таблицы запятых , в основном простоалиасинг этого первого SELECT, который я могу затем использовать во втором запросе.

Это вернет 1 строку для каждого имени хоста, причем строка, возвращаемая для каждого, будет единственной

0 голосов
/ 23 июня 2011
  1. Хотите найти последнее сканирование каждой станции?
  2. Или вы хотите найти каждую станцию, которая была в сети (или не в сети) во время самого последнего сканирования?

У меня был бы основной список рабочих станций, прежде всего,Тогда у меня будет основной список сканов.И тогда у меня будет таблица сканов, которая содержит результаты сканов.

Чтобы ответить # 1, вы бы использовали подзапрос или встроенное представление, которое возвращает для каждой рабочей станции свои id и max (scandate), а затем вы присоединили бы этот подзапрос к таблице сканирования, чтобы вынуть сканированиестрока для идентификатора этой рабочей станции, чье значение scandate соответствует его максимуму (scandate).

Чтобы ответить на вопрос №2, вы будете искать все рабочие станции, где существует запись (или там, где запись отсутствует), mutatis mutandis ) в таблице сканов, где scandate = max (дата) в основном списке сканов.

0 голосов
/ 23 июня 2011
SELECT TOP 1 WITH TIES * 
FROM YourTable
ORDER BY ROW_NUMBER() OVER(PARTITION BY hostname ORDER BY datequeried DESC)
0 голосов
/ 23 июня 2011
select hostname,
       max(datequeried) as datequeried
from YourTable
group by hostname
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...