SQL Server 从行中获取最大值并联接到另一个表

2fjabf4q  于 2022-11-28  发布在  其他
关注(0)|答案(4)|浏览(192)

对不起,如果这是愚蠢的,我真的是一个新手试图钉这个。

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

我想要的是
这就是我的查询的外观,但是当我执行连接时,它提供了多行结果(而不是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
rpppsulh

rpppsulh1#

你写的东西在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

查看它是否正常工作here
或者,您也可以使用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

看它如何工作here

sg3maiej

sg3maiej2#

下面是使用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

如果同一id没有重复的rank,那么就不需要DISTINCT

pengsaosao

pengsaosao3#

就我个人而言,我喜欢下面的。只是更干净的海事组织(虽然不确定性能)

select * 
from a
inner join b on a.id=b.id and b.rank=(select max(rank) rnk from b where id=id)
ubby3x7f

ubby3x7f4#

最简单的方法和我个人的喜好是做以下:

SELECT TOP (1) WITH TIES A.*
FROM A
ORDER BY ROW_NUMBER() OVER (PARTITION BY ID ORDER BY [Rank] DESC)

这样做可能看起来不明显,但它确实很好用。

相关问题