0

HAWQ。如何按输入/输出时间加入/输出行?

简单的

在此处输入图像描述

谢谢

4

2 回答 2

1

我相信这就是你想要达到的目标。诀窍是使用窗口函数“row_number()”。

select sub1.car_id, sub1.id_in, sub1.cross_date_time_in, sub2.id_out, sub2.cross_date_time_out 
from (
      select car_id, id as id_in, 
             cross_date_time as cross_date_time_in, 
             row_number() over (partition by car_id order by cross_date_time) as row_num
      from source_table
      where direction = 'in') as sub1
      join (select car_id, id as id_out, 
                   cross_date_time as cross_date_time_out, 
                   row_number() over (partition by car_id order by cross_date_time) as row_num
            from source_table
            where direction = 'out') as sub2 on sub1.car_id = sub2.car_id and sub1.row_num = sub2.row_num;

如果您喜欢这种格式,您也可以使用公用表表达式来编写它。

with sub1 as (select car_id, id as id_in, cross_date_time as cross_date_time_in, 
              row_number() over (partition by car_id order by cross_date_time) as row_num
              from source_table
              where direction = 'in'),
     sub2 as (select car_id, id as id_out, cross_date_time as cross_date_time_out, 
              row_number() over (partition by car_id order by cross_date_time) as row_num
              from source_table
              where direction = 'out')
select sub1.car_id, sub1.id_in, sub1.cross_date_time_in, 
       sub2.id_out, sub2.cross_date_time_out
from sub1
join sub2 on sub1.car_id = sub2.car_id and sub1.row_num = sub2.row_num;
于 2017-06-13T18:43:26.353 回答
0

create table source_table
(
  id INT
  ,car_id INT
  ,direction text
  ,cross_date_time TIMESTAMP
);
insert into source_table
    values (1, 1,'in', to_timestamp('2017-02-02-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 1,'in', to_timestamp('2017-02-12-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 1,'in', to_timestamp('2017-02-18-10:20:15', 'yyyy-MM-dd hh:mi:ss'));;
insert into source_table
    values (1, 1,'in', to_timestamp('2017-02-25-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 1,'out', to_timestamp('2017-02-08-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 1,'out', to_timestamp('2017-02-09-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 1,'out', to_timestamp('2017-02-27-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 2,'in', to_timestamp('2017-02-02-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 2,'in', to_timestamp('2017-02-12-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 2,'in', to_timestamp('2017-02-18-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 2,'out', to_timestamp('2017-02-08-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 2,'out', to_timestamp('2017-02-14-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 2,'out', to_timestamp('2017-02-27-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 2,'out', to_timestamp('2017-02-29-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 3,'in', to_timestamp('2017-02-02-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 3,'in', to_timestamp('2017-02-12-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 3,'out', to_timestamp('2017-02-08-10:20:15', 'yyyy-MM-dd hh:mi:ss'));
insert into source_table
    values (1, 3,'out', to_timestamp('2017-02-14-10:20:15', 'yyyy-MM-dd hh:mi:ss'));



select sub1.car_id, sub1.id_in, sub1.cross_date_time_in, sub2.id_out, sub2.cross_date_time_out
from (
      select car_id, id as id_in,
             cross_date_time as cross_date_time_in,
             row_number() over (partition by car_id order by cross_date_time) as row_num
      from source_table
      where direction = 'in') as sub1
     join (select car_id, id as id_out,
                   cross_date_time as cross_date_time_out,
                   row_number() over (partition by car_id order by cross_date_time) as row_num
            from source_table
            where direction = 'out') as sub2 on sub1.car_id = sub2.car_id and sub1.row_num = sub2.row_num;

结果错误。

1 1 2017-02-12 10:20:15.000000 1 2017-02-09 10:20:15.000000

如果使用左连接变体:

select sub1.car_id, sub1.id_in, sub1.cross_date_time_in, sub2.id_out, sub2.cross_date_time_out
from (
      select car_id, id as id_in,
             cross_date_time as cross_date_time_in,
             row_number() over (partition by car_id order by cross_date_time) as row_num
      from source_table
      where direction = 'in') as sub1
     left join (select car_id, id as id_out,
                   cross_date_time as cross_date_time_out,
                   row_number() over (partition by car_id order by cross_date_time) as row_num
            from source_table
            where direction = 'out') as sub2 on sub1.car_id = sub2.car_id and sub1.row_num = sub2.row_num;

错误结果:1 1 2017-02-12 10:20:15.000000 1 2017-02-09 10:20:15.000000 1 1 2017-02-18 10:20:15.000000 1 2017-02-27 10:20:15.000000 1 1 2017-02-25 10:20:15.000000

于 2017-06-15T08:43:14.343 回答