给定用户和策略之间的多对多表,其结构如下:
policy_id| user_id
---------|---------
1 | 1
3 | 1
6 | 1
2 | 2
4 | 3
6 | 4
5 | 5
7 | 5
6 | 7
6 | 8
我正在查找用户正在使用的所有唯一策略组合的列表。
我正在寻找的结果是:
主动策略组合:[1,3,6],[2],[4],[6],[5,7]
这在单个查询中可能吗?我唯一的解决方案是扫描整个表格,并将每个组合加载到一个集合中,过滤出重复的集合。
编辑:
回答意图和目的。
我正在将生成的策略集的实时处理分离到我们向用户显示的UI中,并缓存这些信息,这样我们就不会不断地重新计算这些信息。对于给定时间段内的给定策略集,用户会接收到数量确定的消息。
例如,如果您有策略1,2,3-我们计算并确定您将接收消息2,5。目前,我们正在对每个客户端查询进行计算/处理。我想确定所有可能的策略组合,以便可以预先缓存映射。
您可以聚合两次:
select policies, count(*) as num_users
from (select user_id, array_agg(distinct policy_id order by policy_id) as policies
from t
group by user_id
) u
group by policies;