2013-10-15 5 views
0

내 SQL을 구조화하는 더 좋은 방법은 무엇입니까?SQL 중첩 쿼리 MAX (날짜)

각 클라이언트에 대해 가장 최근의 이벤트를 선택하고 싶습니다. 이벤트는 where 절로 필터링됩니다. 클라이언트가 where 절을 만족시키는 이벤트가 없다면, 나는 또한 주목하고 싶다.

EVENT_DATE EVENT_STAFF  EVENT_TYPE 
1/1/2013 Myley_Cyrus  Music_Awards 
3/1/1947 Albert_Einstein Noble_Prize 

현재, 나는이 일을하고있다 : 1. 클라이언트 ID를. 2. 해당 클라이언트에 대한 모든 이벤트를 선택하십시오. 2b. 이러한 이벤트를 필터링하십시오. 3. 가장 최근의 필터링 된 이벤트를 선택하거나 'X'를보고하십시오 (기준을 충족시키는 이벤트 없음).

문제는 MAX (e_date)가 가장 최근의 이벤트 (각 e_staff/e_type 콤보에 대해 하나의 행)가 아닌 여러 행을 반환한다는 것입니다.

/* STEP #3: SELECT MOST RECENT FILTERED EVENT FOR EACH CLIENT */ 
SELECT   MAX(e_date), e_staff, e_type 
FROM   client INNER JOIN events ON events.e_case_no = client.c_id 
WHERE   events.id IN (
    /* STEP #2: SELECT FILTERED EVENTS FOR THOSE CLIENTS */ 
    SELECT events.id 
    FROM events INNER JOIN client ON e_case_no = c_id 
    WHERE client.c_id IN (
     /* STEP #1: SELECT CLIENTS */                
     SELECT client.c_id 
     ... 
     /* STEP #1 END */ 
    ) 
    AND ... --FILTER THE EVENTS 
    /* STEP #2 END */ 
) 
GROUP BY e_staff, e_type 
/* STEP #3 END */ 

Thank you !.

답변

1

이 작동합니다

select * 
from 
(
     select *, 
      row_number() over (partition by e_staff, e_type order by e_date desc) rn 
     from yourfilteredrows 
) v 
where rn = 1 
0

내가 생각하는 row_number() 윈도우 기능을보고 시도

Select e.id, staff, type, c.Name from Events e inner join 
(Select max(e_date) Date, clientid from Events group by clientid) x 
on x.Date = e.e_date and x.clientId = e.ClientId 
inner join Clients c on c.id = x.ClientId