복붙노트

[SQL] 행에서 최대 값을 얻기과 다른 테이블에 합류

SQL

행에서 최대 값을 얻기과 다른 테이블에 합류

이 바보 경우 미안 해요, 난 정말이를 못을 시도 초보자입니다.

Table A:
ID  Rank Name
1   100  Name1
1    45  Name2
2    60  Name3
2    42  Name4
2    88 Name5

Table B:
ID FileName
1  fn1
2  fn2

내가 원하는 것은

1 fn1 name1
2 fn2 name5

이것은 내 쿼리 외모가 좋아이지만, 그것은 나에게 결과의 여러 행을 (대신 최대의) 내가 할 때 가입 제공

select B.Id B.FileName,A.Name
FRom B
JOIN ( 
select A.Id, MAX(A.Rank)as ExpertRank 
from A 
group by A.Id
) as NewA on A.Id = B.ID 
join B on A.Rank = NewA.Rank

서브 쿼리 나 조인을 수행에 문제를 얻을, 잘 작동합니다.

나는이 문제를 어떻게 해결합니까?

감사.

나는 SQL 서버 2008 R2가

마지막 하나는 내가 놓친 것입니다.

select B.Id B.FileName,A.Name 
FRom B 
JOIN (  
select A.Id, MAX(A.Rank)as ExpertRank  
from A  
group by A.Id 
) as NewA on A.Id = B.ID  
join B on A.Rank = NewA.Rank 
and A.Id = newA.Id

해결법

  1. ==============================

    1.당신이 쓴 것은 전적으로 잘못 어디로 갔는지 취소하지만이 작업을해야되지는 그렇게 절에서의 누락했다

    당신이 쓴 것은 전적으로 잘못 어디로 갔는지 취소하지만이 작업을해야되지는 그렇게 절에서의 누락했다

    select 
           B.Id, 
           B.FileName,
           A.Name
    FRom B
         INNER JOIN A
         ON A.id = B.id
        INNER JOIN ( 
              select A.Id, MAX(A.Rank)as ExpertRank 
              from A 
              group by A.Id
         ) as NewA 
        ON a.Id = NewA.ID 
           AND a.Rank = NewA.ExpertRank
    

    여기에 작업을 참조하십시오

    또한 대신 ROWNUMBER 사용할 수 있습니다

    WITH CTE AS 
    (
       SELECT ID, 
              RANK,
              Name,
              ROW_NUMBER() OVER (PARTITION BY ID ORDER BY RANK DESC) rn
       FROM A
    )
    SELECT b.Id b.FileName,cte.Name
    FROM
       b
       INNER JOIN cte 
       ON b.id = cte.id
          and cte.rn = 1
    

    여기에 작업을 참조하십시오

  2. ==============================

    2.다음으로는 MAX () 대신에 조인 대답입니다 :

    다음으로는 MAX () 대신에 조인 대답입니다 :

    SELECT DISTINCT b.id, b.filename, a1.name
    FROM a a1
    JOIN b
      ON b.id = a1.id
    LEFT JOIN a a2
      ON a2.id = a1.id
      AND a2.rank > a1.rank
    WHERE a2.id IS NULL
    

    동일한 ID에 대한 중복 순위가없는 경우에, 당신은 DISTINCT가 필요하지 않습니다.

  3. ==============================

    3.개인적으로, 나는 아래 좋아한다. 단지 청소기 IMO (하지 않도록 성능에 대한 생각)

    개인적으로, 나는 아래 좋아한다. 단지 청소기 IMO (하지 않도록 성능에 대한 생각)

    select * 
    from a
    inner join b on a.id=b.id and b.rank=(select max(rank) rnk from b where id=id)
    
  4. from https://stackoverflow.com/questions/9473718/getting-max-value-from-rows-and-joining-to-another-table by cc-by-sa and MIT license