【问题标题】:Difference between dates in different rows不同行中日期之间的差异
【发布时间】:2013-01-28 19:59:37
【问题描述】:

我的问题是,我需要按 stationname 和 connectornumber 和 day 分组的 chargebegin & chargeend 行(时间戳服务器)之间的平均时间。

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

所以实际上我必须选择第一个 Chargebegin 并找到下一个 Chargeend(具有相同的 station/connectornumber 组合和 min(id) > chargebegin.id 的那个)来获得差异。

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

数据库是postgresql 9.2

测试数据:

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');

【问题讨论】:

  • 也许您应该从添加表定义开始,包括键和可能的外键。

标签: postgresql timestamp rows multiple-columns datediff


【解决方案1】:

这可能有一些语法错误,因为我现在无法测试它,但你应该知道如何解决它。

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() 来获取匹配的开始/结束事件,然后进行任何需要的计算。

【讨论】:

  • 非常感谢!这正是我一直在寻找的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 2011-02-01
  • 2021-10-19
相关资源
最近更新 更多