【问题标题】:Select all but / Delete rows which exist for every ID选择所有但/删除每个 ID 存在的行
【发布时间】:2017-08-28 17:33:09
【问题描述】:

我有一张桌子:

表格


  RoomID   Name   Class   Gender
1  A       John    CS     Male
2  A       Mike    EE     Male
3  A       Mili    PD     Female
4  B       John    CS     Male
5  B       Mili    PD     Female
6  C       John    CS     Male

我想选择所有行,期望那些 (Name, Class) 存在 x% 或更多 ID 的行,这意味着如果 x = 100 和某个(NameA, ClassA) 对于表中的每个 ID 都存在,而不是过滤掉 Name = NameA 和 Class = ClassA 的行。

例如:如果 x = 100,则应删除第 6、4、1 行。 (John, CS) 每个 ID - A,B,C 都存在。 结果:

  RoomID   Name   Class   Gender
2  A       Mike    EE     Male
3  A       Mili    PD     Female
5  B       Mili    PD     Female

如果 x = 60,那么现在也需要删除第 3,5 行。 (Mili, PD) 存在 ID A、B,因此存在 67% 的 ID。 结果:

  RoomID   Name   Class   Gender
2  A       Mike    EE     Male

*请注意,我在表格之外没有任何信息,我只知道在这种情况下我检查了哪些列的值(名称,类)。

非常感谢!

【问题讨论】:

    标签: mysql sql bigdata


    【解决方案1】:

    您可以使用以下方法获取具有给定组合的总房间 ID 的比例:

    select name, class, count(*) as cnt, count(*) / numrooms as p
    from t cross join
         (select count(distinct roomid) as numrooms from t) x
    group by name, class;
    

    然后您可以使用它进行删除:

    delete t
         from t join
              (select name, class, count(*) as cnt, count(*) / numrooms as p
               from t cross join
                    (select count(distinct roomid) as numrooms from t) x
               group by name, class
              ) tt
              on tt.name = t.name and tt.class = t.class
         where p >= 0.7;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 2013-12-26
      • 1970-01-01
      • 2015-06-09
      • 2020-12-15
      • 1970-01-01
      • 2013-04-21
      • 2011-11-09
      相关资源
      最近更新 更多