оставьте каждые две строки одного и того же столбца в sql и преобразуйте результат в считанные секунды - PullRequest
1 голос
/ 31 мая 2019

Мне нужна помощь с моим столом Hive.

   DATE               |    ID     |    RESTDATESINSECONDS     

 2019-03-28 10:05:27        1             (2019-03-28 10:05:38)-(2019-03-28 10:05:27)
 2019-03-28 10:05:38        1             (2019-03-28 10:14:14)- (2019-03-28 10:05:38)
 2019-03-28 10:14:14        1             (2019-03-28 10:14:16) -(2019-03-28 10:14:14)
 2019-03-28 10:14:16        1             (2019-03-28 10:14:46) -(2019-03-28 10:14:16)
 2019-03-28 10:14:46        1             (2019-03-28 10:15:30) -(2019-03-28 10:15:30)
 2019-03-28 10:15:30        1                """
     """                    """              """

У меня двести тысяч строк. Я хотел бы вернуть это как:

   DATE               |    ID     |    RESTDATESINSECONDS     

 2019-03-28 10:05:27        1             11
 2019-03-28 10:05:38        1             516
 2019-03-28 10:14:14        1             2
 2019-03-28 10:14:16        1             30
 2019-03-28 10:14:46        1             44
 2019-03-28 10:15:30        1             ""

Я перепробовал все виды скобок и подсчетов, но все, что я пробую, приводит к различным ошибкам синтаксиса! У кого-нибудь есть идеи?

Большое спасибо:)

Ответы [ 3 ]

0 голосов
/ 31 мая 2019

Если строки, из которых вы хотите, чтобы разница во времени не гарантировалась последовательной, вы можете сделать это следующим образом (что работает в любом случае):

select 
  t.id,
  t.date,
  datediff(
    s, 
    t.date, 
    (select min(date) from tablename where id = t.id and date > t.date)
  ) restdateinseconds
from tablename t 

См. Демоверсию .
Результаты:

> id | date                | restdateinseconds
> -: | :------------------ | ----------------:
>  1 | 28/03/2019 10:05:27 |                11
>  1 | 28/03/2019 10:05:38 |               516
>  1 | 28/03/2019 10:14:14 |                 2
>  1 | 28/03/2019 10:14:16 |                30
>  1 | 28/03/2019 10:14:46 |                44
>  1 | 28/03/2019 10:15:30 |              
0 голосов
/ 02 июня 2019

Используйте функцию lead() для получения следующей строки date и unix_timestamp() для преобразования дат в секунды, затем вычтите:

with test_data as (
select stack(6,
'2019-03-28 10:05:27',
'2019-03-28 10:05:38',
'2019-03-28 10:14:14',
'2019-03-28 10:14:16',
'2019-03-28 10:14:46',
'2019-03-28 10:15:30') as `date`
)

select `date`, unix_timestamp(lead(`date`) over(order by `date`)) - unix_timestamp(`date`) as restdateinseconds
  from test_data;

Возвращает:

date                 restdateinseconds
2019-03-28 10:05:27    11   
2019-03-28 10:05:38    516  
2019-03-28 10:14:14    2    
2019-03-28 10:14:16    30   
2019-03-28 10:14:46    44   
2019-03-28 10:15:30    NULL 
0 голосов
/ 31 мая 2019
with cte_test_table
as
(select * from
  ( values('2019-03-28 10:05:27',1)
         ,('2019-03-28 10:05:38',1)
         ,('2019-03-28 10:14:14',1)
         ,('2019-03-28 10:14:16',1)
         ,('2019-03-28 10:14:46',1)
         ,('2019-03-28 10:15:30',1)
  ) as t([Date],ID)
)

select ID, [Date]
,datediff(ss,[Date],LAG ([Date], 1, [Date]) over (partition by ID order by [Date] desc)) as RESTDATESINSECONDS
from cte_test_table
order by [Date]
...