多对多关系中最小的“原子”成员定义

时间:2019-11-19 18:22:49

标签: sql aggregate aggregate-functions

我遇到了一个有趣的问题,我试图找到一种高效的解决方法,但它却使我不知所措。

我正在加载一些数据提取,其中包含成千上万的用户,每个用户在多对多关系中至少属于一组。有几十到数百个小组。  组不是分层的,但是它们的成员可以并且确实可以重叠。此结构的简化版本如下:

create table users (
   id int not null primary key,
   username varchar(100) not null unique
);

create table groups (
   id int not null primary key,
   groupname varchar(100) not null unique
);

create table users_to_groups (
   user_id int not null references users(id),
   group_id int not null references groups(id),
   constraint pk_users_to_groups primary key (user_id, group_id)
);

组基本上是具有与之相关联的属性(通常是某种统计数据)的填充对象,这些属性可以根据数据类型以不同的方式进行汇总。许多组具有相同的属性类型,但属性值不同,并且有规则确定将哪个属性值应用于该组的成员...但是,重要的是不要“重复计算”信息(例如在某些情况下)其中的用户属于多个组),这将导致一些非常错误的结果。为此,我试图为关联的属性定义“作用域”(由于缺乏更好的术语)。

我将范围定义为“组成一个或多个组的用户的原子集合”,其方式是在范围之间没有重叠,但多个范围可以在多个组中。举例来说,

  • 用户1、2、3、4和5属于第1组
  • 用户4、5、6、7和8属于第2组
  • 用户9和10属于第3组

我希望有4个作用域:

  • 范围1将包含用户1、2和3
  • 范围2将包含用户4和5
  • 范围3将包含用户6、7和8
  • 范围4将包含用户9和10

这样,我可以将范围定义为组关系:

  • 第1组包含范围1和2
  • 第2组包含范围2和3
  • 第3组仅包含范围4

我想做的是编写一个查询,以表格形式产生上述结果,例如:

UserId, ScopeId, GroupId
1, 1, 1
2, 1, 1
3, 1, 1
4, 2, 1
4, 2, 2
5, 2, 1
5, 2, 2
6, 3, 2
7, 3, 2
8, 3, 2
9, 4, 3
10, 4, 3

我无法确定如何编写将产生这些结果的查询。有人可以帮忙吗?

0 个答案:

没有答案