代码之家  ›  专栏  ›  技术社区  ›  Jamie S

按分组并使用聚合来消除记录

  •  0
  • Jamie S  · 技术社区  · 1 年前

    我有一张这样的临时桌子。

    playlist_id |   item_id  |    passed
    -----------------------------------------
     123        |   111      |    true
     123        |   111      |    false
     123        |   111      |    true
     123        |   112      |    true
     456        |   212      |    false
     789        |   212      |    true
    

    我需要减少结果,以便 playlist_id, item_id 当且仅当中的所有值 passed 是真的,所以在这种情况下,我想:

    playlist_id |   item_id  |    passed
    -----------------------------------------
     123        |   112      |    true
     789        |   212      |    true
    

    因为第二条记录有 false 对于 播放列表id,项目id 配对,则需要消除整个配对组。 我试过使用 group by having 所以

    select 
      playlist, 
      item_id
    from 
      temp table
    group by
      playlist_id,
      item_id
    having passed = true
    

    但它给了我所有至少有一双的鞋 true 价值

    如何消除所有 播放列表id,项目id 记录其布尔值中的任何一个 通过 字段为假?

    干杯

    1 回复  |  直到 1 年前
        1
  •  1
  •   Barmar    1 年前

    您需要在中使用聚合值 HAVING 。否则,您只是在每组中测试一个随机行。

    使用 MIN(passed) 以获得的最小值 passed 在每组中。这将是 1 如果所有值 true , 0 如果有 false 价值观

    SELECT playlist, item_id
    FROM temp_table
    GROUP BY playlist, item_id
    HAVING MIN(passed) = true