从行获取最大值并连接到另一个表

use*_*148 22 sql sql-server sql-server-2008

对不起,如果这是愚蠢的,我真的是一个新手试图指出这一点.

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
Run Code Online (Sandbox Code Playgroud)

我想要的是

1 fn1 name1
2 fn2 name5
Run Code Online (Sandbox Code Playgroud)

这是我的查询的样子,但是当我进行连接时,它给了我多行结果(而不是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
Run Code Online (Sandbox Code Playgroud)

子查询工作正常,我得到了加入的问题.

我该如何解决?

谢谢.

我有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
Run Code Online (Sandbox Code Playgroud)

Con*_*rix 30

你写的是在from子句中缺少A所以它不完全清楚你哪里出错但这应该有效

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
Run Code Online (Sandbox Code Playgroud)

看到它在这里工作

或者你也可以使用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
Run Code Online (Sandbox Code Playgroud)

看到它在这里工作


Mar*_*ams 25

这是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
Run Code Online (Sandbox Code Playgroud)

如果同一个ID没有重复的排名,那么您不需要DISTINCT.

  • +1非常好.我以前从未遇到过这个解决方案.这是一个[工作示例](http://data.stackexchange.com/stackoverflow/query/62609/sample-3-for-9473718) (2认同)
  • @ConradFrix,我不能相信.我从书籍[SQL Antipatterns](http://pragprog.com/book/bksqla/sql-antipatterns)中选择了这种类型的查询.使用适当的索引,在某些情况下,这应该比子查询更快,因为子查询通常会否定索引的使用. (2认同)
  • 它是如何工作的:当 a1.rank 处于最大值时,则没有 a2.rank 具有更大的值,因此连接的 a2 行值为 NULL。 (2认同)