2013-02-13 3 views
0

Hyразница между датами в разных строках

моя проблема в том, что мне нужно среднее время между chargebegin & chargeend ряд (timestampserver), сгруппированные по stationname и connectornumber и день.

Основная проблема заключается в том, что я не могу использовать функцию Max oder Min, потому что несколько раз в таблице у меня одно и то же имя станции/connecternumber.

Так что на самом деле мне нужно выбрать первый заряд и найти следующий обвиняемый (тот, у которого одна и та же комбинация столбцов/соединителей, и min (id)> chargebegin.id), чтобы получить разницу.

Я пробовал много, но на самом деле я понятия не имею, как это сделать.

База данных PostgreSQL 9.2

Testdata:

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

Возможно, вам стоит начать с определения таблицы, включая ключ (ключи) и возможные внешние ключи. – wildplasser

ответ

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 

Это предполагает, что всегда заканчивается событие для события начала и что это событие не может перекрываться (означает, что для stationname и connectornumber, может быть только одна связи в любое время). Поэтому вы можете указать row_number(), чтобы получить соответствующие начальные и конечные события, а затем выполнить любой расчет.

+0

Спасибо большое! Это именно то, что я искал! – user2067767