#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;