Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL | |计算每个城市花费的时间(字段)_Sql_Oracle - Fatal编程技术网

SQL | |计算每个城市花费的时间(字段)

SQL | |计算每个城市花费的时间(字段),sql,oracle,Sql,Oracle,我陷入了这样的境地:我需要计算在特定城市花费的时间。 这里我有三个专栏: 时间--移动到特定城市的当前时间 添加城市——当前城市 移除城市--上一个城市已从 所以整个场景就像,让我们举个例子: 在第一行中,由于“添加和删除城市”中未提及任何内容,这意味着该人并没有从一个城市迁移到另一个城市。 现在进入第二排,因为它表明它从B移到了A,因此当前时间是从2021-03-21 12:40:00到2021-03-21 12:45:00在B停留了一段时间 我必须计算每个城市花费的总时间。首先,让我们创

我陷入了这样的境地:我需要计算在特定城市花费的时间。 这里我有三个专栏:

  • 时间--移动到特定城市的当前时间
  • 添加城市——当前城市
  • 移除城市--上一个城市已从
  • 所以整个场景就像,让我们举个例子:

    在第一行中,由于“添加和删除城市”中未提及任何内容,这意味着该人并没有从一个城市迁移到另一个城市。 现在进入第二排,因为它表明它从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?另外:请以纯文本形式提供示例数据,可以复制和粘贴。没有人可以在图像上进行测试(我们论坛上的很多志愿者都喜欢测试我们的解决方案,尽管不是每个人都这么做)。