2016-11-05 10 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

Iこのウィンドウ関数を使用して近づくことになる。

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

DISTINCT ON(式[、...])を選択し、各セットの最初の行のみを保持します与えられた式が等しいと評価される行の数。 DISTINCT ON式は、ORDER BY(上記参照)と同じ規則を使用して解釈されます。各セットの「最初の行」は、ORDER BYを使用して目的の行が最初に表示されない限り、予測できないことに注意してください。

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

それはPostgreSQLがだけにして自己を行うあるようdistinct onが許可されていない場合は、参加:

select tray, type, qty 
from 
    r 
    join (
     select type, max(qty) as qty 
     from r 
     group by type 
    ) s using (type, qty) 
関連する問題