2016-09-15 72 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秒 - 这是简单的足够。不过,我还需要将前两名合并在一起 - 他们的持续时间合并,starttime与id 1的starttimeendttime作为id 3的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