2016-04-05 10 views
2

Hallo Leute Ich habe eine Postgres-Tabelle mit einer Spalte für Ereignis und eine Spalte für die Sequenz. Jedes Ereignis kann mehrere Folgen haben. Für die Ex:Finden min + 1 in Postgres

Event | Sequence 
a  | 1 
a  | 4 
a  | 5 
b  | 1 
b  | 2 

Jetzt weiß ich, dass select min (Sequenz) Gruppe von Ereignis mir die minimale Sequenz gibt. Wie bekomme ich den nächsten Wert nach dem min Wert? Ich hoffe das ergibt Sinn. Danke im Voraus. Ich benutze Postgres 9.3.

Antwort

2

Sie ROW_NUMBER() Partitionierung von Event und Bestellung von Sequence verwenden können, die zweitniedrigste Sequenznummer pro Ereignis zu erhalten;

SELECT Event, Sequence 
FROM (
    SELECT Event, Sequence, 
     ROW_NUMBER() OVER (PARTITION BY Event ORDER BY Sequence) rn 
    FROM Table1 
) z 
WHERE rn = 2; 

An SQLfiddle to test with.

0

EDIT etwas komplizierter, aber wenn Sie eine Abfrage benötigen, die nicht auf ROW_NUMBER() angewiesen ist, eine Unterabfrage mit einer verwenden Selbstverknüpfung für jedes Ereignis Reihen mit mindestens Folge auszuschließen:

SELECT outer_query.Event, MIN(outer_query.Sequence) AS SecondMinSeq 
FROM Table1 as outer_query 
INNER JOIN (
    SELECT Table1.Event, MIN(Sequence) AS MinSeq 
    FROM Table1 
    GROUP BY Table1.Event 
) AS min_sequences 
ON outer_query.Event = min_sequences.Event AND outer_query.Sequence <> min_sequences.MinSeq 
GROUP BY outer_query.Event 

SQL Fiddle: http://sqlfiddle.com/#!15/4438b/7

+0

was ist, wenn Sequenzen nicht in Ordnung sind ... zum Beispiel, wenn eine Sequenzen 1,3,7,11 usw. hatte, dann wähle ich die zweitmindestens minimale Sequenz..Hope, die mehr Sinn macht .. – Ang