2016-09-15 4 views
1

Ich habe eine Tabelle, die eine Reihe von Objekten zurückgibt. Dies ist ein kleiner Abschnitt eines Beispiels Ergebnis (in JSON):Postgresql - Reduzieren von Zeilen auf Eins, wenn eine Bedingung erfüllt ist

Abfrage:

SELECT id, starttime, endtime, duration, type FROM things 

Ergebnis:

{ 
    "id": 3, 
    "starttime": "2016-09-15T03:27:09", 
    "endtime": "2016-09-15T03:31:43", 
    "duration": 274, 
    "type": "bad" 
}, 
{ 
    "id": 2, 
    "starttime": "2016-09-15T03:26:48", 
    "endtime": "2016-09-15T03:27:09", 
    "duration": 20, 
    "status": "good" 
}, 
{ 
    "id": 1, 
    "starttime": "2016-09-15T03:19:46", 
    "endtime": "2016-09-15T03:26:48", 
    "duration": 422, 
    "status": "bad" 
}, 

Ich versuche, etwas weniger als 30 Sekunden auszuschließen - das ist einfach genug. Allerdings muss ich auch die beiden oberen zusammen kombinieren - ihre Dauern kombiniert, die starttime mit ID 1 starttime und endttime als ID 3 endtime. Also das:

{ 
    "starttime": "2016-09-15T03:19:46", 
    "endtime": "2016-09-15T03:31:43", 
    "duration": 696, 
    "status": "bad" 
}, 

Ist das in Postgres/SQL möglich? Ich denke, ich könnte etwas in Java/C# herausfinden, aber würde es lieber in der Abfrage tun.

Antwort

1

können Sie ROW_NUMBER() verwenden:

SELECT MAX(CASE WHEN s.rnk = 1 THEN s.starttime END) as starttime, 
     MAX(CASE WHEN s.rnk = 2 THEN s.endtime END) as endtime, 
     SUM(s.duration) as dur, 
     --You didn't say which status you want 
FROM (
    SELECT t.*, 
      ROW_NUMBER() OVER(ORDER BY t.id) as rnk 
    FROM things t 
    WHERE t.duration >= 30) s 
WHERE s.rnk < 3 
Verwandte Themen