2010-12-15 3 views
0

EventId (PK), Date, EmployeeId (FK) 및 StatusId (FK) 테이블이 있습니다.SELECT 레코드의 이전 레코드 내용 (관계 없음)

특정 직원의 직전에 발생한 레코드의 기준 (날짜순으로 시간순으로)을 기준으로 레코드를 선택해야합니다. 나는 관계가 없기 때문에 이것을 어떻게하는지 모른다.

I는 직원 ID,중인 모든 사건의 개수를 선택하려는 여기서

(a) StatusId = 1
(b) 해당 직원 ID (시간적으로)에 의해 마지막 이벤트의 StatusId을 갖는다 9.

이벤트에 대한 선행 레코드는 반드시 해당 직원과 관련이있는 것은 아닙니다.

* SQL Server를 사용하고 있으며 날짜순으로 이전 이벤트를 참조하고 있음을 참고하도록 편집했습니다.

+0

같은 * 순으로 * 날짜에 따라 또는 이벤트 ID –

+0

왜 당신이'parent_id'를 저장하지 않습니다 이전 행에 대한 참조? Btw, 대답은 강력하게 어떤 DBMS를 사용 하느냐에 달려 있습니다. 예를 들어 오라클에서는 분석 기능 덕분에 매우 쉽게 처리 할 수 ​​있습니다. – zerkms

답변

1

좋아, 음, 당신이 할 수있는 하위 쿼리 즉

SELECT EmployeeID, COUNT(*) 
     FROM Events e1 
WHERE (SELECT TOP 1 StatusID FROM Events e2 WHERE e1.EmployeeID = e2.EmployeeID ORDER 
     BY Date desc) = 9 
GROUP BY EmployeeID, COUNT(*) 
0
Events (EventId, Date, EmployeeId, StatusId) 

select EmployeeId, count(*) from Events as e1 
where e1.StatusId = 1 
     and exists (select e2.EventID from Events as e2 
       where e2.EmployeeId=e1.EmployeeId and e1.date > e2.date and e2.StatusId = 9 order by e2.date desc limit 1) 
group by EmployeeId 

+0

완벽하게 작동합니다. 단! 정말 고마워! – Brett

+0

이전 레코드의 상태가 9가 아닌 경우에는 작동하지 않습니다. –

+0

아마도 내 질문에 명확하지 않지만 의도 한 기능입니다. 본질적으로, 애플리케이션의 비즈니스 규칙은 StatusId = 9의 이벤트가 StatusId = 1 인 이벤트를 "Successful"이벤트로 카운트해야합니다. 그런 다음 직원이 그룹화 한 모든 "성공적인"이벤트를 반환해야합니다. – Brett

관련 문제