2016-11-05 48 views
1

我有一张表格,描述每个托盘中有多少FISH,VEG或肉。如何选择每种类型的最大值

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不存在,我该如何解决这个问题?

+0

我想你的查询,它工作正常(我假设你的表名是'R' )。 – miselking

+0

@miselking R不是我的数据库中的表。 R在查询中创建。我更新了我的帖子以显示我的意思 – tenkii

回答

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; 
+0

是否有其他解决方案?我认为能够用我已经学过的结构来写这个(从来没有见过这个分区) – tenkii

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 
0

distinct on

SELECT DISTINCT ON(表达式[,...])保持各组的仅第一行给定表达式评估为相等的行数。 DISTINCT ON表达式使用与ORDER BY相同的规则进行解释(请参见上文)。请注意,除非使用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)