如何选择每种类型的最大值

时间:2016-11-05 22:25:41

标签: sql postgresql aggregate

我有一张表格,描述每个托盘中有多少FISH,VEG或OR肉。

 tray  | qty | type
-------+-----+-------
     1 |   5 | FISH
     2 |   6 | VEG
     2 |   2 | FISH
     2 |   5 | MEAT
     3 |   8 | VEG
     3 |   3 | FISH
     3 |   9 | MEAT
     4 |  10 | MEAT

让我们调用这个表R(它是我在查询中创建的子表)。

我想要的是一张表格,其中显示哪个托盘的每种类型的数量最多,如下所示:

  type | tray
-------+------
  FISH |  1 
   VEG |  3
  MEAT |  4

我尝试编写以下查询

SELECT type AS type1, tray
FROM (SELECT ... bla bla) AS R
WHERE R.qty IN (SELECT MAX(qty) FROM R WHERE type = type1);

错误是R不存在,我该如何解决?

3 个答案:

答案 0 :(得分:0)

我会使用窗口函数来解决这个问题:

select r.type, r.tray
from (select r.*,
             row_number() over (partition by type order by qty desc) as seqnum
      from r
     ) r
where seqnum = 1;

答案 1 :(得分:0)

SELECT otr.tray, otr._type, _qty 
FROM 
    Your_Table otr 
    JOIN ( 
        SELECT _type, MAX(qty) _qty 
        FROM Your_Table 
        GROUP BY _type 
    ) A ON A._type = otr._type AND _qty = qty

答案 2 :(得分:0)

distinct on

  

SELECT DISTINCT ON(expression [,...])仅保留给定表达式求值的每组行的第一行。使用与ORDER BY相同的规则解释DISTINCT ON表达式(参见上文)。注意"第一行"除非使用ORDER BY来确保首先出现所需的行,否则每个集合都是不可预测的。

select distinct on (tray, type) *
from r
order by tray, type, qty desc

如果不允许distinct on,因为它只是Postgresql,那么进行自我加入:

select tray, type, qty
from
    r 
    join (
        select type, max(qty) as qty
        from r
        group by type
    ) s using (type, qty)