SQL查询返回多行的最大值

时间:2017-08-24 16:54:27

标签: sql

我有一张看起来像这样的表:

A    B    C
1    2    2
3    4    6
1    2    3
3    4    5
3    4    4
1    2    1

我需要做的是给出一组代表 A B 的二维元组,我需要为每个具有最大 C

例如,如果我的数组是[(1,2)],那么我的结果表就像A=1B=2一样,那么我的最大 C 是3

A    B    C
1    2    3

如果我的数组是[(1,2), (3,4)],那么我的结果表就像A=1B=2一样,那么我的最大 C 是3而{{1} }}和A=3我的最大 C 是6

B=4

我觉得这可以通过使用SQl子查询来完成。有点像:

A    B    C
1    2    3
3    4    6

在单个SQL查询中执行此操作是否有益处,而不是对我的数组的每个元素执行SQL查询?

3 个答案:

答案 0 :(得分:1)

使用GROUP BYMAX

SELECT A, B, MAX(C) AS C
FROM tab
GROUP BY A, B
ORDER BY A, B;

修改

如果SQL Server可以使用表变量:

DECLARE @my_array AS TABLE(A  INT, B INT);
INSERT INTO @my_array(A, B) VALUES (1,2);


SELECT t.A, t.B, MAX(t.C) AS C
FROM tab t
JOIN @my_array ma
  ON t.A = ma.A AND t.B = ma.B
GROUP BY t.A, t.B
ORDER BY t.A, t.B;

<强> Rextester Demo

答案 1 :(得分:0)

SELECT A, B, MAX(C) AS C FROM #temp where a=1 and b=2 GROUP BY A, B

答案 2 :(得分:0)

共同相关的子查询将会这样做:

select t1.*
from my_table t1
where (t1.a, t1.b) = in ( values (1,2), (3,4) )
  and t1.c = (select max(c) 
              from my_table t2
              where t1.a = t2.a
                and t1.b = t2.b)
order by t1.a, t1.b;

如果您愿意,可以避免使用共同相关的子查询。有时它们往往比同等解决方案慢:

select t1.*
from my_table t1
where (t1.a, t1.b, t1.c) in (select t2.a, t2.b, max(t2.c) 
                             from my_table t2
                             where (t2.a, t2.b) in (values (1,2), (3,4))
                             group by t2.a, t2.b)
order by t1.a, t1.b;

values (1,2), (3,4)的部分是你&#34;数组输入&#34;。

以上是标准的ANSI SQL。

在线示例:http://rextester.com/QPY97515