2017-03-20 1 views
0

Table_01를 선택하나 개의 테이블에서 서로 다른 사용자와 다른 테이블에 최신 날짜

-------------------------------------------------- 
ROW_ID | NAME | EVENT_DATE | EVENT_LOCATION 
-------------------------------------------------- 
11106 | Frank | 27/01/2017 | London 
11109 | Frank | 19/01/2017 | Munich 
11105 | James | 27/01/2017 | New York 
11110 | James | 02/01/2017 | L.A 
11101 | Joe | 27/01/2017 | Paris 
11104 | Joe | 26/01/2017 | Barcelona 
11107 | Joe | 31/01/2017 | Tokyo 
11102 | Tom | 24/01/2017 | Prague 
11103 | Tom | 03/01/2017 | Lisbon 
11108 | Tom | 20/01/2017 | Dublin 

나는 별개의 사용자를위한 Table_01를 쿼리, 그리고 또한 그들의 대부분을 알게 될 것입니다 최근 EVENT_DATE 및 EVENT_LOCATION부터 까지 Table_02

답변 :

--------------------------------------------------- 
NAME | NAME | EVENT_DATE | EVENT_LOCATION 
--------------------------------------------------- 
Frank | Frank | 27/01/2017 | London 
James | James | 27/01/2017 | New York 
Joe  | Joe  | 31/01/2017 | Tokyo 
Tom  | Tom  | 24/01/2017 | Prague 

마이크로 소프트 SQL 서버 2016의 호환성 수준 : SQL 서버 2005 (90)

답변

1
당신은 row_number()를 사용하여이 작업을 수행 할 수 있습니다

:

select t2.* 
from (select distinct name from table_01) n join 
    (select t2.*, 
      row_number() over (partition by name order by event_date desc) as seqnum 
     from table_02 t2 
    ) t2 
    on n.name = t2.name and t2.seqnum = 1. 

당신은 정말이에 대한 table_01을 필요로하지 않는 것 , 당신이 그것을 원한다면 필터링 :

select t2.* 
from (select t2.*, 
      row_number() over (partition by name order by event_date desc) as seqnum 
     from table_02 t2 
    ) t2 
where t2.seqnum = 1. 
+0

뭐죠 table_02과 T2의 차이? –

+0

't2'는'table_02'의 별칭입니다. –

0

나는 두 테이블이 합류하는 방법을 보지 못했다. 에 대한에 name에 대한 ept.

이렇게하는 방법에는 여러 가지가 있습니다. 여기에 그들 중 일부는 다음과 같습니다

select Name, Event_Location, Event_Date 
from (
    select u.Name, e.Event_Date, e.Event_Location 
     , rn = row_number() over (
       partition by u.Name 
       order by e.[Event_Date] desc 
      ) 
    from (select distinct Name from table_01) u 
     left join table_02 e 
     on u.Name = e.Name 
) as sub 
where rn = 1 

:

with common_table_expression as()row_number()

with cte as (
    select u.Name, e.Event_Date, e.Event_Location 
     , rn = row_number() over (
       partition by u.Name 
       order by e.[Event_Date] desc 
      ) 
    from (select distinct Name from table_01) u 
     left join table_02 e 
     on u.Name = e.Name 
) 
select Name, Event_Location, Event_Date 
    from cte 
    where rn = 1 

하위 쿼리 대신 cte를 사용하여 10 apply 버전 :

select distinct 
    u.Name 
    , e.Event_Location 
    , e.[Event_Date] 
    from (select distinct Name from table_01) u 
    cross apply (
     select top 1 
      Event_Date 
      , Event_Location 
     from table_02 e 
     where e.Name =u.Name 
     order by e.Event_Date desc 
     ) as e; 

top with ties 버전 :

select top 1 with ties 
    u.Name, e.Event_Date, e.Event_Location 
from (select distinct Name from table_01) u 
    left join table_02 e 
    on u.Name = e.Name 
    order by 
    row_number() over (
     partition by u.Name 
      order by e.Event_Date desc 
    ) 
+0

이름이 유일한 연결 행입니다. –

관련 문제