选择具有最大聚合函数值的组

时间:2014-08-14 08:30:40

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

我有这个查询

       select dca_sif, maxupp
       from (select d.sifra dca_sif , sum(col1) as maxup
              from tableD d join tablev v on d.id=v.d_id
             join tableT t on v.id=t.v_id 
            group by d.sif
            order by maxup desc
           )
      where rownum=1;

这会返回第一个值,但是如果我有更多具有相同maxup的组,我该如何返回所有这些值? 如果我删除rownum = 1,它将返回所有组和相应的maxup。 我想返回max(sum(col1))但这会导致错误。数据库是oracle。

3 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情: -

SELECT dca_sif, MAX(maxup)
FROM (SELECT d.sifra dca_sif , SUM(col1) AS maxup
      FROM tableD d JOIN tablev v ON d.id=v.d_id
      JOIN tableT t ON v.id=t.v_id 
      GROUP BY d.sif
      ORDER BY maxup DESC
      )
WHERE ROWNUM=1
GROUP BY dca_sif;

这可能对您有所帮助。

答案 1 :(得分:1)

您可以将您的选择与相同的选择组合,但不包含rownum限制。比加入最大ID。你的陈述中有很多表,所以很难为我测试,但这应该有效:

SELECT count(qry2.dcasif) || ' groups', sum( qry2.maxup2)
          FROM (  SELECT dca_sif, MAX (maxup) AS maxup1
                    FROM (  SELECT d.sifra dca_sif, SUM (col1) AS maxup
                              FROM tabled d
                                   JOIN tablev v ON d.id = v.d_id
                                   JOIN tablet t ON v.id = t.v_id
                          GROUP BY d.sif
                          ORDER BY maxup DESC)
                   WHERE ROWNUM = 1
                GROUP BY dca_sif) qry1
             , (  SELECT dca_sif, MAX (maxup) AS maxup2
                    FROM (  SELECT d.sifra dca_sif, SUM (col1) AS maxup
                              FROM tabled d
                                   JOIN tablev v ON d.id = v.d_id
                                   JOIN tablet t ON v.id = t.v_id
                          GROUP BY d.sif
                          ORDER BY maxup DESC)
                GROUP BY dca_sif) qry2
         WHERE qry1.maxup1 = qry2.maxup2

答案 2 :(得分:1)

SELECT dca_sif, maxup 
FROM
(SELECT a.*,rank() over(order by maxup desc)as Rank
FROM (SELECT d.sifra dca_sif , SUM(col1) AS maxup
  FROM tableD d JOIN tablev v ON d.id=v.d_id
  JOIN tableT t ON v.id=t.v_id 
  GROUP BY d.sif

  )a)
WHERE Rank=1