选择唯一的群组

时间:2018-12-05 21:08:54

标签: sql select group-by union

我有一个表,其值如下:

|---------------------|------------------|
|        USER         |        ITEM      |
|---------------------|------------------|
|        Abel         |         1        |
|---------------------|------------------|
|        Abel         |         2        |
|---------------------|------------------|
|        Bart         |         1        |
|---------------------|------------------|
|        Bart         |         2        |
|---------------------|------------------|
|        Curt         |         3        |
|---------------------|------------------|
|        Curt         |         4        |
|---------------------|------------------|
|        Dawn         |         5        |
|---------------------|------------------|
|        Emma         |         5        |
|---------------------|------------------|
|        Emma         |         6        |
|---------------------|------------------|
|        Emma         |         7        |
|---------------------|------------------|
|        Fina         |         6        |
|---------------------|------------------|

从该表中,我只想选择不遵循的表:

  1. 用户自己只能拥有一项。

  2. 用户只有与另一个用户拥有一个项目时,才能拥有多个项目。

  3. 一组用户只能有一个共同的ITEM。

随后:

  • Fina 只有 1个ITEM ,她确定,因此不应包括在内。
  • Emma 3个项目,但是其中两个与不同的用户共享,因此她确定,因此不应将其包括在内。 / li>
  • 黎明只有 1个项目,她确定,因此不应包括在内。
  • Curt有** 2个项,他不好,应该包括他
  • Bart Abel 有2个共同点,它们是不好,应该包含在内。

SQL是否可能实现此功能,或者我需要用另一种语言编写脚本?

至少我需要知道不正常的用户数

最佳情况,一个表,其中包含错误

项目

1 个答案:

答案 0 :(得分:0)

对于具有多个项目的用户,您可以使用窗口功能:

select user
from (select t.*, count(*) over (partition by item) as item_cnt
      from t
     ) t
where item_cnt = 1
group by user
having count(*) >= 2;

对于与另一用户共享一个以上项目的用户,可以使用自动加入:

select distinct t1.user
from t t1 join
     t t2
     on t1.item = t2.item and t1.user <> t2.user
group by t1.user, t2.user
having count(*) > 1;

最终的解决方案是这两个查询中的union