sql—计算红移时差

u0njafvf  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(394)

我有一张table table_a :

event_id        event_start                 process_id          process_start                name            country
A1              2020-07-01 21:19:01         B1                  2020-07-01 21:20:05          google          US
A1              2020-07-01 21:19:01         B2                  2020-07-01 21:21:01          google          US
A1              2020-07-01 21:19:01         B3                  2020-07-01 21:23:04          google          US
A4              2020-07-01 14:59:12         C1                  2020-07-01 15:01:14          bing            UK
A5              2020-07-01 12:39:14         D1                  2020-07-01 12:49:13          bing            CA
A6              2020-07-01 11:49:46         E1                  2020-07-01 11:52:59          facebook        US

在这张table上我有 event_id 也可以是一样的,如果 event_id 是一样的吗 event_start 也一样。 process_id 是唯一的,进程启动时可以有重复项。我想计算一下 event_start 以及 process_start 对于每个 event_id ,问题是 event_start 有相同的时间但是 process_start 可以有不同的时间戳。我想从酒店取两次 process_start 如果他们不止一个。第一个是最早的(分钟) process_start 最新(最大值) process_start 所以我想要的输出是这样的:

event_id        event_start                 process_id          process_start                name            country        earliest_diff_minute                                latest_diff_minute
A1              2020-07-01 21:19:01         B1                  2020-07-01 21:20:05          google          US             1 (2020-07-01 21:20:05 - 2020-07-01 21:19:01)       3 (2020-07-01 21:23:05 - 2020-07-01 21:19:04)
A1              2020-07-01 21:19:01         B3                  2020-07-01 21:23:04          google          US             1 (2020-07-01 21:20:05 - 2020-07-01 21:19:01)       3 (2020-07-01 21:23:05 - 2020-07-01 21:19:04)
A4              2020-07-01 14:59:12         C1                  2020-07-01 15:01:14          bing            UK             2 ( 2020-07-01 15:01:14 - 2020-07-01 14:59:12)      2 ( 2020-07-01 15:01:14 - 2020-07-01 14:59:12) 
A5              2020-07-01 12:39:14         D1                  2020-07-01 12:49:13          bing            CA             10                                                  10
A6              2020-07-01 11:49:46         E1                  2020-07-01 11:52:59          facebook        US             3                                                   3

所以如果 process_id 是唯一的,最小和最大时间差将是相同的。如果大于1,则记录最大值和最小值,同时丢弃中间的所有值。

31moq8wy

31moq8wy1#

我想复制品 name 以及 country . 你可以只使用窗口函数,尤其是 min() 以及 max() 要获取每个分组的最早和最新处理日期,请执行以下操作:

select a.*,
       datediff('m', event_start, max(process_start) over (partition by event_id, name, country)),
       datediff('m', event_start, min(process_start) over (partition by event_id, name, country))
from table_a a
wtzytmuj

wtzytmuj2#

我认为有很多方法可以达到你的目标,这是我第一次想到的

SELECT event_id,
       event_start,
       process_id,
       process_start,
       name,
       country,
       datediff('m', event_start, first_process_start) as earliest_diff_minute,
       datediff('m', last_process_start, event_start) as latest_diff_minute
FROM (
SELECT event_id,
       event_start,
       process_id,
       process_start,
       name,
       country
       first_value(process_start) 
         over (partition by event_id 
               order by process_start 
               rows between unbounded preceding and unbounded following) as first_process_start,
       last_value(process_start) 
         over (partition by event_id 
               order by process_start 
               rows between unbounded preceding and unbounded following) as last_process_start
FROM my_schema.my_table) as a
WHERE process_start = first_process_start
OR process_start = last_process_start

基本上,在子查询中为每一行检索第一个和最后一个进程。然后只检索进程开始时间等于其中一个的行,然后计算日期差。

相关问题