如何从记录中选择信息,以及之后的第一个没有出现的记录

时间:2018-08-02 09:28:21

标签: sql postgresql time-series aggregate

我有一个看起来像这样的表

CREATE TABLE mytable (
    id SERIAL PRIMARY KEY,
    ts TIMESTAMP,
    expected_departure TIMESTAMP,
    aimed_departure TIMESTAMP,
    stop TEXT,
    service TEXT,
    vehicle_ref TEXT
)

我想找到出现标识符(stop, service, vehicle_ref)的最后一条记录,以及没有同一ts的行都返回相同的(stop, service, vehicle_ref)的第一条记录。

我尝试了许多不同的方法来做,但是还没弄清楚。

如果可以简化查询操作,则可以重组数据,甚至切换到时间序列数据库。

编辑: 这是一个示例,为简单起见,省略了日期:

// First API call
id: 1,
ts: 10:00:00,
aimed_departure: 10:30:00
expected_departure: 10:31:00,
stop: 1,
service: 2,
vehicle_ref: 1000

id: 2,
ts: 10:00:00,
aimed_departure: 10:50:00,
expected_departure: 10:50:00,
stop: 1,
service: 3,
vehicle_ref: 2000

// Second API call
id: 3,
ts: 10:32:00,
aimed_departure: 10:50:00,
expected_departure: 10:50:00,
stop: 1,
service: 3,
vehicle_ref: 2000

我想标识id=1,3并从中进行选择,因为有一个服务(stop: 1, service: 2, vehicle_ref: 1000)出现在第一个API调用中(ts:10:00:00),但没有出现在第二,({ts: 10:32:00)。

服务出现的地方可能有很多电话,但我只对最后一次出现的电话感兴趣,而第一次却没有,只要ts之间的差值不大间隔。

1 个答案:

答案 0 :(得分:0)

只使用max和min并子查询和所有并集

select id,stop, service, vehicle_ref from
   (
     select stop, service, vehicle_ref,T1.id from mytable T1 inner join    
     (select max(id) as id from mytable ) as T2 
      on T1.id=T2.id
    )TT1

union all

select TT4.id,stop, service, vehicle_ref from mytable TT2
inner join 
(

select min(id) as id from
 (
select stop, service, vehicle_ref,min(id) as id from mytable 
group by stop, service, vehicle_ref

  ) TT3
) TT4 on TT2.id=TT4.id

这是输出

id  stop    service     vehicle_ref
3     1          3        2000
1     1          2        1000