С помощью Impala получить количество последовательных поездок - PullRequest
1 голос
/ 04 октября 2019

Пример данных

touristid|day
ABC|1
ABC|1
ABC|2
ABC|4
ABC|5
ABC|6
ABC|8
ABC|10

Выходные данные должны быть

touristid|trip
ABC|4

Логика за 4 - это число последовательных дней, различающихся последовательными днями sqq 1,1,2 - 1-й, а затем 4,56 - 2-й, затем 8 - 3-й, а 10 - 4-й. Я хочу этот вывод, используя запрос импалы

1 Ответ

1 голос
/ 05 октября 2019

Получить предыдущий день, используя функцию lag (), вычислить new_trip_flag, если день-предыдущий_день> 1, затем считать (new_trip_flag).

Демо:

with table1 as (
select 'ABC' as touristid, 1  as day union all
select 'ABC' as touristid, 1  as day union all
select 'ABC' as touristid, 2  as day union all
select 'ABC' as touristid, 4  as day union all
select 'ABC' as touristid, 5  as day union all
select 'ABC' as touristid, 6  as day union all
select 'ABC' as touristid, 8  as day union all
select 'ABC' as touristid, 10 as day 
)

select touristid, count(new_trip_flag) trip_cnt
  from 
       ( -- calculate new_trip_flag
         select touristid,
                case when (day-prev_day) > 1 or prev_day is NULL then true end  new_trip_flag
           from       
                ( -- get prev_day
                  select touristid, day, 
                         lag(day) over(partition by touristid order by day) prev_day
                    from table1
                )s
        )s
 group by touristid;

Результат:

touristid   trip_cnt    
ABC         4   

То же самое будет работать и в Hive.

...