Еще один метод, использующий collect_set
и принимающий размер возвращаемого массива для расчета отдельных писем.
Демонстрация:
--your data example
with table1 as ( --use your table instead of this
select stack(6,
123, 'AAA', 'abc@xyz.com', 1,
123, 'AAA', 'acd@xyz.com', 1,
123, 'AAA', 'ayx@xyz.com', 3,
345, 'BBB', 'nch@xyz.com', 1,
345, 'BBB', 'nch@xyz.com', 1,
678, 'CCC', 'iuy@xyz.com', 1
) as (id, name, email, type )
)
--query
select distinct id, name, email, type,
size(collect_set(email) over(partition by id)) cnt
from table1
where type=1
Результат:
id name email type cnt
123 AAA abc@xyz.com 1 2
123 AAA acd@xyz.com 1 2
345 BBB nch@xyz.com 1 1
678 CCC iuy@xyz.com 1 1
Здесь нам все еще нужен DISTINCT, потому что аналитическая функция не удаляет дубликаты, как в случае 345 BBB nch@xyz.com
.