2016-09-15 13 views
1

私は一連のオブジェクトを返すテーブルを持っています。これは、(JSON)で例の結果の小さなセクションです:Postgresql - 条件が満たされた場合に行を1に減らす

問合せ:

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

結果:

{ 
    "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" 
}, 

私は30秒未満のものを除外しようとしています - これは簡単です十分な。しかし、私はまた、トップ2を一緒に組み合わせる必要があります - その期間を組み合わせ、starttimeとid1のstarttimeendttimeをid3のendtimeとして組み合わせる必要があります。だからこれは:

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

これはPostgres/SQLで可能ですか?私はJava/C#で何かを考え出すことができると思っていますが、むしろ質問でそれをやります。

答えて

1

あなたはROW_NUMBER()を使用することができます。

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 
関連する問題