首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同行中日期的差异

不同行中日期的差异
EN

Stack Overflow用户
提问于 2013-02-13 17:55:25
回答 1查看 191关注 0票数 0

为什么?

我的问题是,我需要一个chargeend和chargeend行(timestampserver)之间的平均时间,按站点名称和连接器编号和日期分组。

主要的问题是,我不能使用Max oder函数,因为我在表中有几次相同的stationname/connecternumber组合。

因此,实际上我必须选择第一个chargebegin并找到下一个chargeend (具有相同的station/connectornumber组合和min(id) >chargebegin.id的那个)才能得到差值。

我试了很多,但实际上我不知道该怎么做。

数据库为postgresql 9.2

测试数据:

代码语言:javascript
复制
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');
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-13 18:33:02

这可能有一些语法错误,因为我现在不能测试它,但你应该得到一个想法,如何解决它。

代码语言:javascript
复制
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()来获取匹配的开始/结束事件,然后执行所需的任何计算。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14850739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档