使用 IN 条件选择行并分组

Posted

技术标签:

【中文标题】使用 IN 条件选择行并分组【英文标题】:Select rows using IN condition and group by 【发布时间】:2021-11-13 13:38:25 【问题描述】:

我有下表,其中存储了建议 ID 和目标 ID

id|goal_id|suggestion_id
1 |     12|   1
2 |     13|   2
2 |     17|   2
3 |     14|   1
4 |     15|   3
5 |     16|   3
6 |     12|   4
6 |     18|   4

我想查询建议 ID 以获得特定的目标 ID 组合。

例如:

goal_id(13, 17) => 我需要建议 id: 2 goal_id(12, 14) => 我需要建议 id: 1 goal_id(14, 12) => 我需要建议 id: 1 goal_id(12, 18) => 我需要建议 id: 4

是否可以通过这种方式查询suggest_id,或者我必须重新设计我的表? (我使用的是 PostgreSQL 数据库)

INPUT: (12, 14) or (14, 12) id的顺序可能会改变

select suggestion_id from table WHERE goal_id IN(12, 14) group by suggestion_id

查询返回以下id:1,1,4

【问题讨论】:

【参考方案1】:

如果您想要子集匹配并且正在寻找 2 个(或 n 项目),Matt 的答案就有效。但是,如果您想要完整的匹配项,例如 12 和 14 而没有别的,那么我会建议对该方法进行更改。假设表没有重复:

select suggestion_id
from t
group by suggestion_id
having array_agg(goal_id order by goal_id) = array[12, 14];

请注意,使用数组可以轻松传入任意数量的值。您还可以调整它以使用数组进行子集匹配:

select suggestion_id
from t
where goal_id = any(array[12, 14])
group by suggestion_id
having array_agg(goal_id order by goal_id) = array[12, 14]

或者在这种情况下,您可以在having 子句中使用数组长度:

having count(*) = cardinality(array[12, 14])

【讨论】:

谢谢戈登·林诺夫!这正是我想要的。它运作良好,但我不明白为什么.. 例如这一行的目的是什么:“goal_id order by goal_id”【参考方案2】:

WHERE 子句适用于单个行,而不是组。

IN 本质上是WHERE goal_id = 12 OR goal_id = 14

你需要的是第二个过滤器,上面写着but only groups which have Both of these

  select suggestion_id
    from table
   where goal_id IN (12, 14)
group by suggestion_id
  having count(distinct goal_id) = 2

HAVING 子句聚合到组之后应用。所以,现在我们可以计算组中有多少不同的目标,并且只保留正好有 2 个不同目标的组。

distinct 以防一个suggestion_id 可以多次关联相同的goal_id

注意:如果您的 IN() 列表包含 2 个以上的项目,您还需要更新 = 2

【讨论】:

感谢 MatBailie 的回答!

以上是关于使用 IN 条件选择行并分组的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何按一列分组行并按另一列选择一行?

根据条件选择行并从向量中设置值

在使用条件聚合进行分组时选择多个第 n 个值 - 熊猫

SQL:根据条件选择不同的用户和分组

在嵌套选择查询中按条件分组后加入

房间 - 选择带有 IN 条件的查询?