2016-11-05 7 views
1

Ich habe eine Tabelle, die beschreibt, wie viele FISH, VEG, OR Fleisch in jedem Fach sind.So wählen Sie das Maximum für jeden Typ

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 

Läßt diese Tabelle R nennen (es ist eine Untertabelle, die ich in meiner Anfrage erstellt).

Was ich will, ist eine Tabelle, die besagt, welches Fach die höchste Anzahl jeder Art wie dieses hat:

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

Ich habe versucht, die folgende Abfrage

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

der Fehler ist, dass R zu schreiben existiert nicht, wie löse ich das?

+0

ich Ihre Anfrage versucht, es funktioniert gut (Ich gehe davon aus, dass Ihr Tabellenname 'R'). – miselking

+0

@miserking R ist keine Tabelle in meiner Datenbank. R wird in der Abfrage erstellt. Ich habe meinen Beitrag aktualisiert, um zu zeigen, was ich meine – tenkii

Antwort

0

Ich würde Ansatz, um diese unter Verwendung von Fensterfunktionen:

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

Gibt es andere Lösungen? Ich denke, ich kann dies mit Konstrukten schreiben, die ich gelernt habe (diese Partition habe ich noch nie zuvor gesehen) – 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 (expression [...]) hält nur die erste Zeile eines jeden Satzes von Zeilen, bei denen die angegebenen Ausdrücke gleich sind. Die DISTINCT ON-Ausdrücke werden mit den gleichen Regeln wie für ORDER BY interpretiert (siehe oben). Beachten Sie, dass die "erste Zeile" jedes Satzes nicht vorhersehbar ist, es sei denn, ORDER BY wird verwendet, um sicherzustellen, dass die gewünschte Zeile zuerst angezeigt wird.

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

Wenn distinct on ist nicht erlaubt, da es Postgresql ist nur dann ein Selbst trete:

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