Получение максимального значения из строк и присоединение к другой таблице
Извините, если это глупо, я действительно новичок, пытающийся прибить это.
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
Вот как выглядит мой запрос, но он дает мне несколько строк результатов (вместо max), когда я делаю соединение
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
Ответы
Ответ 1
То, что вы написали, отсутствовало A в предложении 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
Посмотрите, как работает здесь
Ответ 2
Здесь ответ с JOINs вместо 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
.