Предоставление дополнительных данных при выборе отдельных строк - PullRequest
0 голосов
/ 21 июля 2010

У меня есть таблица событий входа в систему из Active Directory.Одним из типов этих событий являются входы в систему компьютера, которые включают IP-адрес компьютера, выполняющего вход в систему.Это удобно, так как предоставляет метку времени для определения того, какой компьютер находился на каком IP в данный момент времени.Я пытаюсь создать запрос, который даст мне временную метку списка, когда машина впервые вошла в 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 ]

2 голосов
/ 21 июля 2010

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

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

SELECT IP, max(DateTime) as DateTime
FROM EventStream
WHERE Machine='$Machine'
GROUP BY IP
1 голос
/ 22 июля 2010

Немного опоздал на вечеринку, но это будет делать то, что вы хотите, без необходимости сначала искать 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 Date DESC) для каждой, в соответствии со столбцом Date. Если вы хотите первую дату, просто удалите «DESC» из заказа по.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...