假设我有一个包含两列的表:
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]
现在,cat中有5种产品,cat2中有3种产品。但是,我想限制每个类别中的产品数量。假设上限为3。这3个产品可以是任意随机产品,只要它们属于同一类别即可。上限也可以很大。值得注意的是,我要使collect_set在达到上限后停止。因为生成输出然后执行过滤可能很昂贵。也欢迎使用collect_set以外的方法。感谢您的任何建议!
答案 0 :(得分:2)
您可以通过窗口函数和collect_set的组合来执行此操作。按类别进行分区,并为每个类别,产品组合获取<= 3行,然后在子集中使用collect_set。
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