Postgresql 不同行中日期之间的差异
Hy 我的问题是,我需要按stationname和connectornumber和day分组的chargebegin和chargeend行(timestampserver)之间的平均时间 主要问题是,我不能使用Max-order-Min函数,因为我在表中多次使用相同的stationname/connecternumber组合 因此,事实上,我必须选择第一个chargebegin并找到下一个chargeend(具有相同站点/连接器编号组合和min(id)>chargebegin.id的chargeend)以获得差异 我试了很多,但实际上我不知道怎么做 数据库是postgresql 9.2 测试数据:Postgresql 不同行中日期之间的差异,postgresql,timestamp,rows,multiple-columns,datediff,Postgresql,Timestamp,Rows,Multiple Columns,Datediff,Hy 我的问题是,我需要按stationname和connectornumber和day分组的chargebegin和chargeend行(timestampserver)之间的平均时间 主要问题是,我不能使用Max-order-Min函数,因为我在表中多次使用相同的stationname/connecternumber组合 因此,事实上,我必须选择第一个chargebegin并找到下一个chargeend(具有相同站点/连接器编号组合和min(id)>chargebegin.id的charge
create table datatable (
id int,
connectornumber int,
message varchar,
metercount int,
stationname varchar,
stationuser varchar,
timestampmessage varchar,
timestampserver timestamp,
authsource varchar
);
insert into datatable values (181,1,'chargebegin',4000,'100','FCSC','2012-10-10 16:39:10','2012-10-10 16:39:15.26');
insert into datatable values (182,1,'chargeend',4000,'100','FCSC','2012-10-10 16:39:17','2012-10-10 16:39:28.379');
insert into datatable values (184,1,'chargebegin',4000,'100','FCSC','2012-10-11 11:06:31','2012-10-11 11:06:44.981');
insert into datatable values (185,1,'chargeend',4000,'100','FCSC','2012-10-11 11:16:09','2012-10-11 11:16:10.669');
insert into datatable values (191,1,'chargebegin',4000,'100','MSISDN_100','2012-10-11 13:38:19','2012-10-11 13:38:26.583');
insert into datatable values (192,1,'chargeend',4000,'100','MSISDN_100','2012-10-11 13:38:53','2012-10-11 13:38:55.631');
insert into datatable values (219,1,'chargebegin',4000,'100','MSISDN_','2012-10-12 11:38:03','2012-10-12 11:38:29.029');
insert into datatable values (220,1,'chargeend',4000,'100','MSISDN_','2012-10-12 11:40:14','2012-10-12 11:40:18.635');
这可能有一些语法错误,因为我现在无法测试它,但您应该知道如何解决它
with
chargebegin as (
select
stationname,
connectornumber,
timestampserver,
row_number() over(partition by stationname, connectornumber order by timestampserver) as rn
from
datatable
where
message = 'chargebegin'
),
chargeend as (
select
stationname,
connectornumber,
timestampserver,
row_number() over(partition by stationname, connectornumber order by timestampserver) as rn
from
datatable
where
message = 'chargeend'
)
select
stationname,
connectornumber,
avg(b.timestampserver - a.timestampserver) as avg_diff
from
chargebegin a
join chargeend b using (stationname, connectornumber, rn)
group by
stationname,
connectornumber
这假设begin事件始终存在end事件,并且这些事件不能重叠(意味着对于stationname和connectornumber,任何时候都只能有一个连接)。因此,您可以使用
row_number()
获取匹配的开始/结束事件,然后执行任何需要的计算。也许您应该从添加表定义开始,包括键和可能的外键。非常感谢!这正是我要找的!