【问题标题】:SELECT unique groups选择唯一组
【发布时间】:2018-12-05 21:08:53
【问题描述】:

我有一个表,其值如下:

|---------------------|------------------|
|        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. USERS 自己只能拥有一项。

  2. USERS 只有在与另一位 USER 一起拥有的情况下才能拥有多个 ITEM。

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

接下来:

  • Fina 只有 1 项,她还好,不应该包括在内。
  • Emma3 件物品,但其中两件是与不同的用户共享的,所以她OK,不应该包括在内。
  • Dawn 只有 1 项,她还好,不应该包括在内。
  • Curt 有 **2 件物品,他不行,应该包括在内
  • BartAbel 有 2 个共同点,它们 NOT OK 应该包括在内。

这可以通过 SQL 实现还是我需要用另一种语言编写脚本?

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

最佳情况,包含错误项目列表的表格

【问题讨论】:

    标签: sql select group-by union


    【解决方案1】:

    对于拥有多个项目的用户,可以使用窗口函数:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-10
      • 2012-03-27
      • 2016-03-22
      • 2021-07-03
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多