如何找到m:n关系中经常重复的最小(n)属性集

时间:2015-06-30 15:11:59

标签: sql statistics

我有两个表:USERS(IDUser,UserDesc)和ROLES(IDRole,RoleDesc),其中m:n关系存储在关联表RolePerUser(IDUser,IDRole)中。

我想将这些角色分组到一个更易于管理的PROFILE中,我需要一种方法来发现哪些角色可以组成一个PROFILE,并以重复频率为基础进行分析。

例如:

USER1  has (Role 1, Role 3, Role 4, Role 5, Role 6)
USER2  has (Role 1, Role 4, Role 5, Role 6, Role 7)
USER3  has (Role 1, Role 4, Role 5, Role 7, Role 8)
  • 一个hypotetic PROFILE1(n = 3)可以建立在角色1,角色4,角色5上 100%用户的覆盖率
  • 另一个PROFILE2(n = 4)可以建立在角色1,角色4,角色5和角色6上,覆盖率为66%

在修复表示PROFILE中ROLES数量的参数(n)之后,我想编写一个可以证明符合条件的关系的SQL查询

有没有办法(统计公式或其他技巧)来完成这项任务?数据集非常大(576个角色对11.069个用户,平均每个用户有20个角色)

提前谢谢

编辑:我正在使用MSSQL 2008 R2

1 个答案:

答案 0 :(得分:0)

如果您有一个设定的号码,那么您可以使用聚合来获得您想要的。查询的结构是:

select ru1.idrole, ru2.idrole, ru3.idrole, ru4.idrole, count(*)
from RolePerUser ru1 join
     RolePerUser ru2
     on ru1.iduser = ru2.iduser and ru1.idrole < ru2.idrole join
     RolePerUser ru3
     on ru2.iduser = ru3.iduser and ru2.idrole < ru3.idrole join
     RolePerUser ru3
     on ru3.iduser = ru4.iduser and ru3.idrole < ru4.idrole
group by ru1.idrole, ru2.idrole, ru3.idrole, ru4.idrole
order by count(*) desc;

这是标准的SQL,它应该适用于所有数据库。

对于性能,您需要RolePerUser(iduser, idrole)上的索引。然后尝试对两个角色,三个角色等进行查询,以查看性能是否可接受。