列有重复时的MAX(列)

时间:2015-08-06 15:09:35

标签: sql aggregate-functions greatest-n-per-group

说我有桌子t1:

c1 | c2 | c3| c4
 1    1    1   A
 1    1    2   B
 1    1    3   C
 1    1    4   D
 1    1    4   E
 1    1    4   F
 2    2    1   A
 2    2    2   A
 2    2    3   A

我想为每个具有最大c3的c1,c2对选择行。问题是,如果我为每个c1执行了最大值(c3),那么将选择哪一行,c2然后自己加入到原始表中?它只是随机选择c3 = 4的三行中的一行吗?

3 个答案:

答案 0 :(得分:0)

您可能不需要加入:

 select c1,c2,c3,maxc3 from (
    SELECT c1,c2, c3,MAX(c3) OVER () as maxc3
    FROM @temp
    GROUP BY c1,c2,c3
    ) a
    where c3 = maxc3

答案 1 :(得分:0)

全部取决于join子句 - 如果你得到MAX(c3)JOIN返回结果:

  • 如果您按列c1c2加入,则会有3行。
  • 如果您添加明显的前一个组合,则只有一行。
  • 如果您按列c1c2c3加入 - 您将有1行。

答案 2 :(得分:0)

  

如果我为每个c1执行max(c3),那么将选择哪一行,c2然后   自我加入了原始表?

=>答案是,将选择与max(c3)值匹配的所有行。

  

是否只是随机选择c3 = 4的三行中的一行?

=>不,和上面一样。将返回与您的自我加入表中的列max(c3)匹配的c3,例如您的c1c2值为1将返回3行,因为它在三行中的最大值为4)。要限制c3上的自我加入,您可能还需要加入c1c2列。

select t1.*
from table1 t1
join 
(
select 
      c1,
      c2,
      max(c3) as c3
 from table1
 group by c1,c2
 ) t on  t.c1 = t1.c1
     and t.c2 = t1.c2
     and t.c3 = t1.c3
 order by t.c1,t.c2

SQL Fiddle Demo