首页 > 解决方案 > SQL:查找所有当前使用的组合

问题描述

给定用户和策略之间的多对多表,其结构如下:

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。目前,我们正在对每个客户端查询进行计算/处理。我想确定所有可能的策略组合,以便我可以预缓存映射。

标签: sqlpostgresql

解决方案


您可以聚合两次:

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;

推荐阅读