从行集中获取列的最大值

时间:2012-02-27 03:07:55

标签: sql sql-server sql-server-2008 tsql

我有一张这样的表

Table A:

Id Count
1  4
1  16
1  8
2  10
2  15
3  18
etc

Table B:
1 sample1.file
2 sample2.file
3 sample3.file

TABLE C:
Count fileNumber
16 1234
4 2345
15 3456
18 4567

依旧......

我想要的是这个

1 sample1.file 1234
2 sample2.file 3456
3 sample3.file 4567

要从表A中获取最大值,我使用

  Select MAX (Count) from A where Id='1'

这很有效但我的问题是将数据与另一个表组合时。

当我加入表B和表A时,我需要获得所有ID的MAX,在我的查询中我不知道Id是什么。

这是我的查询

SELECT B.*,C.*
JOIN A on A.Id = B.ID
JOIN C on A.id = B.ID
WHERE (SELECT MAX(COUNT) 
         FROM A 
        WHERE Id = <what goes here????>)

总结一下,我想要的是表B中的值,表c中的FileNumber(其中计数是表A中ID的最大值)。

更新:修正上面的表C.看起来我需要表A.

3 个答案:

答案 0 :(得分:2)

我认为这是您正在寻找的查询:

select b.*, c.filenumber from b
join (
  select id, max(count) as count from a
  group by id
) as NewA on b.id = NewA.id
join c on NewA.count = c.count

但是,您应该考虑到我不明白为什么在表A中id = 1你选择16来匹配表C(这是最大值)而对于表A中的id = 2你选择10到匹配表C(这是最小值)。我认为你在两种情况下都意味着最大值。

修改

我看到你已经更新了tableA数据。鉴于以前的数据,查询结果如下:

+----+---------------+------------+
| ID |   FILENAME    | FILENUMBER |
+----+---------------+------------+
|  1 | sample1.file  |       1234 |
|  2 | sample2.file  |       3456 |
|  3 | sample3.file  |       4567 |
+----+---------------+------------+

这是working example

答案 1 :(得分:1)

使用Mosty的工作示例(将关键字count重命名为cnt作为列名),这是另一种方法:

with abc as (
  select
    a.id,
    a.cnt,
    rank() over (
      partition by a.id
      order by cnt desc
    ) as rk,
    b.filename
  from a join b on a.id = b.id
)
  select
    abc.id, abc.filename, c.filenumber
  from abc join c
  on c.cnt = abc.cnt
  where rk = 1;

答案 2 :(得分:0)

select
      PreMax.ID,
      B.FileName,
      C2.FileNumber
   from
      ( select C.id, max( C.count ) maxPerID
           from TableC C
           group by C.ID
           order by C.ID ) PreMax

         JOIN TableC C2
            on PreMax.ID = C2.ID
           AND PreMax.maxPerID = C2.Count

         JOIN TableB B
            on PreMax.ID = B.ID