>我有一个包含以下字段的表格
Name:
Location:
Start Time:
End Time:
Total Time:
名称、位置、开始和结束时间是从另一个表中提取的,总时间计算开始时间和结束时间之间的差值,以给出在该位置花费的总时间。开始和结束时间是使用查询提取的,该查询查找用户在该位置的最大和最小时间。例如,典型的结果是:
Name: John
Location: A
Start Time: 08:00
End Time: 10:00
Total Time: 2:00
问题是用户可能在一个位置,转到另一个位置,然后返回到同一位置。例如,另一条记录可能是:
Name: John
Location: B
Start Time: 09:00
End Time: 09:30
Total Time: 0:30
因此,用户将在位置 A 08:00-09:00,然后在 B 09:00-09:30,然后返回到 A 09:30-10:00。由于开始和结束时间只是最小值和最大值,因此最小值始终是他们第一次进入该位置,结束时间是他们最后一次输入该位置的时间。有没有办法修改时间计算以考虑到在位置 B 花费的 0:30 分钟,并从在位置 A 花费的时间中扣除。另一个注意事项是,最多可以有 5 个位置,用户可以全天在每个位置之间来回切换。
这是一个想法。 以下查询返回每个用户在每个位置的时间量:
select name, location,
sum(datediff(s, starttime, endtime)) as TotalTimeInSeconds
from t
group by name, location
如果没有针对所有开始时间和结束时间的单独记录,则需要返回到原始表。
如果你不能回到原始数据,那么你可以使用一个繁琐的自加入来做到这一点:
select t.name, t.location,
min(TotalTime) - sum(t2.totalTime)
from t left outer join
t t2
on t.name = t.name and
t.location <> t2.location and
t2.starttime between t.starttime and t.endtime
group by t.name, t.location
但是,我不建议这样做,因为它需要大量处理。