2010-07-21 1 views
0

У меня есть таблица событий входа, поступающих из Active Directory. Одним из типов этих событий являются машинные входы, которые включают в себя IP-адрес машины, выполняющей вход в систему. Это удобно, поскольку он обеспечивает временный способ определения того, какая машина была на каком IP-адресе в данный момент времени. Я пытаюсь построить запрос, который даст мне timestamped список того, когда машина впервые выполнила вход в IP (спасибо DHCP, IP является переменной).Предоставление дополнительных данных при выборе отдельных строк

Запрос, который просто возвращает список, если IP-адреса, которые были сохранены, просты.

SELECT DISTINCT IP 
FROM EventStream 
WHERE (Machine='$Machine') 

Я знаю, что «выбрать отдельный» - это неоптимальный запрос, поэтому я ищу что-то лучшее. Это, вероятно, включает в себя подзапросы, о которых я знаю очень мало. Не предоставление «Distinct» в этом случае возвращает таблицу с до 2000 строк, поэтому большое количество данных выбирается и не используется.

Мне бы очень хотелось, чтобы фраза запроса была такой, что я получаю список с отметкой времени, когда машина впервые появилась на IP-адресе. Я могу подделать его в коде итерации этого запроса за результаты первым:

SELECT TOP 1 DateTime 
FROM EventStream 
WHERE (Machine='$Machine' and IP='$IP') 
ORDER BY DateTime 

Я уверен, что эти два может быть объединена в единый внучатый-запрос. Возможно ли это, или я должен придерживаться логики приложения, чтобы обеспечить то, что я ищу?

ответ

2

Чтобы подтвердить, что вы хотите видеть все IP-адреса, используемые машиной вместе с первым появлением на каждом IP-адресе?

Если это так, вы должны быть в состоянии сделать что-то вроде этого:

SELECT IP, max(DateTime) as DateTime 
FROM EventStream 
WHERE Machine='$Machine' 
GROUP BY IP 
+0

Подстановка «min» для «max» дает мне то, что мне нужно. Хотя метод min/max даст мне КАК ДОЛГО, он был на этом IP, что также полезно в другой области. Время выполнения этого парня находится на одном уровне с возвращением 2000 строк. НО ... это дает правильный выход! – sysadmin1138

+0

О да, MIN, ой, извините! –

1

Немного опоздал на вечеринку, но это будет делать то, что вы хотите без необходимости сначала найти IP-адреса, а затем цикл через к найти информацию, которую вы хотите:

SELECT Machine, 
     IP, 
     Date 
FROM (SELECT Machine, 
       IP, 
       Date, 
       ROW_NUMBER() OVER (PARTITION BY Machine, IP ORDER BY Date DESC) RN 
     FROM EventStream) EventStream 
WHERE RN = 1 

Это дает вам все IP-адреса для всех машин в Eventstream и возвращает только последнюю дату (ORDER BY DESC Дата) для каждого, в зависимости от даты столбца. Если вы хотите получить первую дату, просто удалите «DESC» из порядка.

+0

Хороший пример подзапроса. Я тоже могу это использовать! Благодаря! – sysadmin1138