2017-05-27 3 views
0

Tut mir leid, ich bin nur versäumt, die seitliche Join!PostgreSQL LATERAL JOIN zu LIMIT GROUP BY

bekam ich eine Tabelle wie folgt aus:

ID | NUMBER | VALUE 
------------------- 
20 | 12  | 0.7 
21 | 12  | 0.8 
22 | 13  | 0.8 
23 | 13  | 0.7 
24 | 13  | 0.9 
25 | Null | 0.9 

Nun möchte Ich mag die ersten 2 Zeilen für jede Zahl nach abnehmender Reihenfolge der VALUE sortiert bekommen.

ID | NUMBER | VALUE 
------------------- 
21 | 12  | 0.8 
20 | 12  | 0.7 
24 | 13  | 0.9 
22 | 13  | 0.8 

Der Code habe ich versucht, so sieht weit wie folgt aus: (Gefunden: Grouped LIMIT in PostgreSQL: show the first N rows for each group?)

SELECT DISTINCT t_outer.id, t_top.number, t_top.value 
FROM table t_outer 
JOIN LATERAL (
    SELECT * FROM table t_inner 
    WHERE t_inner.number NOTNULL 
    AND t_inner.id = t_outer.id 
    AND t_inner.number = t_outer.number 
    ORDER BY t_inner.value DESC 
    LIMIT 2 
    ) t_top ON TRUE 
order by t_outer.value DESC; 

Alles ist so weit in Ordnung, es scheint nur, wie der LIMIT 2 funktioniert nicht. Ich bekomme alle Zeilen für alle NUMBER-Elemente zurück.

Antwort

2

Nutzen Sie Fenster analytische Funktion row_number

Rextester Demo

select "ID", "NUMBER", "VALUE" from 
(select t.* 
,row_number() over (partition by "NUMBER" 
        order by "VALUE" desc 
        ) as rno 
from table1 t 
) t1 
where t1.rno <=2; 

Ausgabe

ID NUMBER VALUE 
21 12  0,8000 
20 12  0,7000 
24 13  0,9000 
22 13  0,8000 
25 NULL 0,9000 

Erläuterung:

innere Abfrage t1 wird assing rno Auftrag von value Beschreibung für jede number Gruppe. Dann können Sie in der äußeren Abfrage rno <= 2 auswählen, um Ihre Ausgabe zu erhalten.

+0

Danke! Das funktioniert. – BenWhite