Как вычислить результат на основе соответствия соседних строк некоторым условиям

#sql #database #hive #hiveql

#sql #База данных #улей #hiveql

Вопрос:

У меня большая база данных, и я хочу выполнить некоторый сложный запрос. Вот демонстрационная таблица:

 id   time   value
0     0001   3333  
1     1111   valueA
2     1112   6666
3     1113   valueB
4     8888   4444 
  

Я хочу получить среднее значение для всех valueA и среднее значение для всех valueB . valueA и valueB соответствуют следующим условиям:
time of valueA и time of valueB близки, например, их разница меньше 2, а количество строк между ValueA и ValueB равно как минимум 3 (включая строку valueA и row valueB ).

Есть ли какой-либо удобный метод для решения этой проблемы?

Комментарии:

1. Это истинное представление времени, 1111 и т.д.?

2. Это значение временной метки unix, и приведенный выше вопрос является примером.

3. Я действительно не понимаю, что происходит, когда в valueA столбце несколько value значений. Кроме того, какое среднее значение вы принимаете?

Ответ №1:

Я не совсем уверен в вашей потребности. С небольшим примером того, что у вас есть на входе вашей проблемы, И что у вас должно быть на выходе, возможно, это будет более понятным.

Тем не менее, возможно, этот код поможет вам в этом.

 with cte_order as
(
    select 
        *
        , row_number() over (order by t1.id)
    from test t1
)
select avg(t1.value), avg(t2.value)
from cte_order t1
    inner join cte_order t2 on t1.time between t2.time - 2 and t2.time   2
where t1.id <> t2.id
    and abs(t1.row_number - t2.row_number) >= 3;