Я пытаюсь сделать простое преобразование улья.Преобразование улья
Может кто-нибудь один предоставить мне способ сделать это? Я попробовал collect_set и в настоящее время просматриваю UDF с открытым исходным кодом klout.
Я пытаюсь сделать простое преобразование улья.Преобразование улья
Может кто-нибудь один предоставить мне способ сделать это? Я попробовал collect_set и в настоящее время просматриваю UDF с открытым исходным кодом klout.
Как использовать функции min и max? Я думаю, что следующее вам предоставит следующее:
SELECT
Unit,
MIN(datetime) as start,
MAX(datetime) as stop
from table_name
group by Unit
;
Спасибо, что ответили. Это не так прямо. Представьте себе разные даты и часовые пояса. Более одного посещения одного и того же подразделения. –
Я думаю, что это дает вам то, что вы хотите. Я не смог запустить его и отладить его. Удачи!
select start_point.unit
, start_time as start
, start_time + min(stop_time - start_time) as stop
from
(select * from
(select date_time as start_time
, unit
, last_value(unit) over (order by date_time row desc between current row and 1 following) as previous_unit
from table
) previous
where unit <> previous_unit
) start_points
left outer join
(select * from
(select date_time as stop_time
, unit
, last_value(unit) over (order by date_time row between current row and 1 following) as next_unit
from table
) next
where unit <> next_unit
) stop_points
on start_points.unit = stop_points.unit
where stop_time > start_time
group by start_point.unit, start_time
;
Спасибо за указатель на использование оконных функций. Не точное решение, но на правильном пути. –
Я нашел его. Спасибо за указатель использовать оконные функции
select *
from
(select *,
case when lag(unit,1) over (partition by id order by effective_time_ut desc) is NULL THEN 1
when unit<>lag(unit,1) over (partition by id order by effective_time_ut desc) then 1
when lead(unit,1) over (partition by id order by effective_time_ut desc) is NULL then 1
else 0 end as different_loc
from units_we_care) a
where different_loc=1
create table temptable as select unit, start_date, end_time, row_number() over() as row_num from (select unit, min(date_time) start_date, max(date_time) as end_time from table group by unit) a;
select a.unit, a.start_date as start_date, nvl(b.start_date, a.end_time) end_time from temptable a left outer join temptable b on (a.row_num+1) = b.row_num;
Там могут быть одни и те же единицы позже, например, ABC может начинаться с Date-time 8 и затем PAR на дату-время 9. нам нужно поддерживать континуум единиц времени. Fyi, простая группа, сделавшая бы эту неправильную картину. –