Улей Как ограничить количество записей в collect_set - PullRequest
0 голосов
/ 26 июня 2018

Допустим, у меня есть таблица, которая содержит два столбца:

Category Productname
Cat1     prod1
Cat1     prod2
Cat1     prod3
Cat1     prod4
Cat1     prod5
Cat2     prod6
Cat2     prod7
Cat2     prod8

Теперь, если я сделаю что-то вроде:

SELECT Category, collect_set(Productname)
FROM myTable;

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

Cat1    [prod1...prod5]
Cat2    [prod6...prod8]

Теперь в кошке 5 товаров, а в кошке 3. Однако я хочу ограничить количество товаров в каждой категории. Допустим, верхний предел равен 3. Три продукта могут быть любыми, если они принадлежат к одной категории. Также верхний предел может быть большим числом. Стоит отметить, что я хочу, чтобы collect_set остановился, как только он достиг верхнего порога. Поскольку генерация выходных данных, а затем выполнение фильтрации могут быть дорогостоящими. Также приветствуются методы, отличные от collect_set. Спасибо за любые предложения!

1 Ответ

0 голосов
/ 26 июня 2018

Вы можете сделать это с помощью комбинации оконной функции и collect_set.Partition по категории и получить <= 3 строки для каждой категории, комбинации продуктов, а затем использовать collect_set в подмножестве. </p>

select category, collect_set(productname)
from 
(
    select category,productname, row_number() over (partition by category) as r_no
    from table_name
) a
where a.r_no <= 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...