SQL | |计算每个城市花费的时间(字段)
我陷入了这样的境地:我需要计算在特定城市花费的时间。 这里我有三个专栏:SQL | |计算每个城市花费的时间(字段),sql,oracle,Sql,Oracle,我陷入了这样的境地:我需要计算在特定城市花费的时间。 这里我有三个专栏: 时间--移动到特定城市的当前时间 添加城市——当前城市 移除城市--上一个城市已从 所以整个场景就像,让我们举个例子: 在第一行中,由于“添加和删除城市”中未提及任何内容,这意味着该人并没有从一个城市迁移到另一个城市。 现在进入第二排,因为它表明它从B移到了A,因此当前时间是从2021-03-21 12:40:00到2021-03-21 12:45:00在B停留了一段时间 我必须计算每个城市花费的总时间。首先,让我们创
我必须计算每个城市花费的总时间。首先,让我们创建样本数据。这是您应该如何向我们提供的:
alter session set nls_date_format = 'dd-mm-yyyy hh24:mi';
create table sample_data (time, add_city, remove_city) as
select to_date('21-03-2021 12:40'), null, null from dual union all
select to_date('21-03-2021 12:45'), 'A' , 'B' from dual union all
select to_date('21-03-2021 14:07'), null, null from dual union all
select to_date('21-03-2021 15:32'), 'B' , 'A' from dual union all
select to_date('21-03-2021 19:51'), null, null from dual union all
select to_date('21-03-2021 20:10'), 'A' , 'B' from dual
;
那么,如果我正确理解了这个问题,这里有一个解决方法。我假设您希望“在每个城市花费的时间”显示为从一天到一秒的间隔时间;如果您只需要以“天”为单位(十进制数字),只需在外部查询中使用sum(duration)
with
prep (duration, city) as (
select lead(time) over (order by time) - time,
nvl(last_value (add_city ignore nulls) over (order by time),
first_value(remove_city ignore nulls) over (order by time
rows between current row and unbounded following))
from sample_data
)
select city, numtodsinterval(sum(duration), 'day') as time_in_city
from prep
group by city
order by city
;
CITY TIME_IN_CITY
---- -------------------
A +00 02:47:00.000000
B +00 04:43:00.000000
此表中是否还有其他字段可以提供?只有这三个字段,无法知道“2021-03-21 12:40:00”记录指的是哪个城市。按照您的解释,只看前两行:2021-03-21 12:40没有发生任何事情,12:45人(“it”)从B移到A。这意味着在这五分钟内,从12:40到12:45,那个人在B。很好,但12:40之前那个人在哪里?或者你不在乎,你必须只考虑这五分钟?(当然,还有,通过查看输入数据中的其他行可以找到什么。)然后:使用此数据模型,在人员从B移动到A之后,您如何保证下一个移动是“从”A,而不是“从”E?另外:请以纯文本形式提供示例数据,可以复制和粘贴。没有人可以在图像上进行测试(我们论坛上的很多志愿者都喜欢测试我们的解决方案,尽管不是每个人都这么做)。