Получение максимального значения из строк и соединение с другой таблицей - PullRequest
18 голосов
/ 28 февраля 2012

Извините, если это глупо, я действительно новичок, пытающийся прибить это.

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 Server 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

Ответы [ 2 ]

27 голосов
/ 28 февраля 2012

То, что вы написали, отсутствовало в предложении from, поэтому не совсем понятно, где вы ошиблись, но это должно работать

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

Посмотрите, как это работает здесь

24 голосов
/ 28 февраля 2012

Вот ответ с помощью JOIN вместо 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

Если для одного и того же идентификатора нет повторяющихся рангов, то DISTINCT.

не требуется.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...