Улей collect_set (), но для удаления последовательных дубликатов - PullRequest
2 голосов
/ 04 мая 2019

Я хочу удалить последовательные дубликаты в массиве при использовании куста.

collect_list() сохраняет все дубликаты, а collect_set() содержит только отдельные записи. Мне нужно что-то посередине.

Например, из приведенной ниже таблицы:

id  |  number
==============
fk        4
fk        4
fk        2
4f        1
4f        8
4f        8
h9        7
h9        4
h9        7

Я бы хотел получить что-то вроде этого:

id | aggregate
===========================
fk   Array<int>(4,2)
4f   Array<int>(1,8)
h9   Array<int>(7,4,7)

1 Ответ

1 голос
/ 05 мая 2019

Используйте аналитическую функцию lag() для получения предыдущего номера и сравнения с текущим номером для проверки последовательных номеров.

Демо-версия:

with your_table as (--replace this subquery with your table
select stack(11, --the number of tuples
'fk',4,'2019-01-01 10:10:10.123',
'fk',4,'2019-01-01 10:10:10.124',
'fk',2,'2019-01-01 10:10:10.125',
'4f',1,'2019-01-01 10:10:10.126',
'4f',8,'2019-01-01 10:10:10.127',
'4f',8,'2019-01-01 10:10:10.128',
'h9',7,'2019-01-01 10:10:10.129',
'h9',4,'2019-01-01 10:10:10.130',
'h9',7,'2019-01-01 10:10:10.131',
'h9',7,'2019-01-01 10:10:10.132',
'h9',7,'2019-01-01 10:10:10.133'
) as (id, number, order_ts)
) --replace this subquery with your table

select id, collect_list(case when number = lag_number then null else number end) as aggregate
  from 
      (select id, number, order_ts,
              lag(number) over (partition by id order by order_ts) lag_number
         from your_table 
       distribute by id sort by order_ts
      )s         
  group by id;

Результат (проверьте здесь: http://demo.gethue.com/hue/editor?editor=318918):

id  aggregate   
4f  [1,8]   
fk  [4,2]   
h9  [7,4,7] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...