2010-07-21 5 views
0

Active Directory에서 오는 로그인 이벤트 테이블이 있습니다. 이러한 이벤트의 한 유형은 로그인을 수행하는 시스템의 IP 주소를 포함하는 시스템 로그인입니다. 주어진 시간에 어떤 컴퓨터가 어떤 IP에 있었는지를 결정할 수있는 타임 스탬프 방식을 제공하므로 편리합니다. 내가 처음에 IP에 로그인했을 때의 timestamped 목록을 제공하는 쿼리를 작성하려고합니다 (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

"최대"에 "최소"를 대입하면 필요한 정보를 얻을 수 있습니다. 최소/최대 방법은 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 

이 당신에게 Eventstream의 모든 기계에 대한 모든 IP를 제공하고 열 날짜에 따라 각각 (날짜 DESC BY ORDER) 마지막 날짜를 반환합니다. 첫 데이트를 원한다면에 의해 주문에서 'DESC'를 제거하십시오.

+0

하위 쿼리의 좋은 예입니다. 나는 이것을 사용할 수있다! 감사! – sysadmin1138

관련 문제