如何在sql中计算平均条件

时间:2016-02-11 13:40:37

标签: sql

我想计算sql中的平均值。我在表中有以下记录。

  

让表名= frarecord

enter image description here

  

在上表中,每列都是NOT NULL。与评论中提到的@peepa一样,我们可以通过标识符识别哪个开始事件与哪个结束事件一起。

我想用以下条件计算时间戳的平均值。

  

当eventid = 5然后时间戳以结束时间结束时

     

当eventid = 6时的情况,然后时间戳以结束时间结束

现在

  

time = endTime - startTime。

  平均

平均(时间)

编辑:时间戳是毫秒而不是sql时间戳。 我尝试使用以下查询来分隔startTime和endTime

查询1:

select 
case  when f.eventid=5 then f.timestamps end as starttime,
case  when f.eventid=6 then f.timestamps end as endtime
from frarecord f 

和Query2:

select f1.timestamps as starttime, f2.timestamps as endtime
from frarecord f
left join frarecord f1 on (f1.id=f.id and f.eventid=5)
left join frarecord f2 on (f2.id=f.id and f.eventid=6)

并得到以下输出。

enter image description here

非常感谢您的帮助。

谢谢。

2 个答案:

答案 0 :(得分:0)

不太确定这是否是您所追求的但是由于提供的数据,它可能是我能想到的最好的,这假设您一次只能运行一个'formname'。 这不是一个完整的答案,但可能是朝着正确方向迈出的一步?

;with tablecte as (
select 
case  when f.eventid=5 then f.timestamps end as starttime,
case  when f.eventid=6 then f.timestamps end as endtime,
f.formname
from frarecord f 
order by ISNULL(starttime,endtime)

--select f1.timestamps as starttime, f2.timestamps as endtime
--from frarecord f
--left join frarecord f1 on (f1.id=f.id and f.eventid=5)
--left join frarecord f2 on (f2.id=f.id and f.eventid=6)

), combine as (

select  t2.starttime, (select top 1 t1.endtime from tablecte t1 where t1.endtime > t2.starttime and t1.formname = t2.formname) as endtime from tablecte t2


)
select AVG(starttime - endtime) from combine

答案 1 :(得分:0)

首先,我按identifier对所有记录进行分组,并在 Gordon Linoff 的帮助下使用以下查询分隔starttimeendtime。答案是Here

我使用的查询:

with f1 as (
  select (case when f.eventid=5 then f.timestamps end) as starttime,
         (case when f.eventid=6 then f.timestamps end) as endtime,
        f.instanceidentifier as identifier,
        f.formid as formid, 
        f.formname as formname
  from frarecord f  
 )
select min(starttime) as starttime, max(endtime) as endtime, identifier
from f1
group by identifier

在运行上面的查询后,我得到了以下输出:

enter image description here

现在我可以计算减去以下方式之后的平均时间(我有时间完成)。

  

time = endTime - startTime

计算平均值的完整查询如下:

select   AVG (endtime-starttime) as average from
(
with f1 as (
  select (case when f.eventid=5 then f.timestamps end) as starttime,
         (case when f.eventid=6 then f.timestamps end) as endtime,
        f.instanceidentifier as identifier,
        f.formid as formid, 
        f.formname as formname
  from frarecord f   
 )
select min(starttime) as starttime, max(endtime) as endtime, identifier
from f1
group by identifier
)