首页 > 解决方案 > 在查看 WHERE 子句中的多个 OR/IN 条件时如何将每个条件限制为一个结果(Postgresql)

问题描述

例如:

SELECT * FROM Customers
WHERE Country IN ('Germany', 'France', 'UK')

我想在我的 IN 子句中为每个国家/地区限制 1 个,所以我只看到总共 3 行:每个国家的一个客户(1 个德国人,1 个法国人,1 个英国人)。有没有一种简单的方法可以做到这一点?

标签: postgresql

解决方案


通常,对于这种类型的解决方案,一个简单的GROUP BY就足够了,但是,由于您已指定要在结果中包含所有列,因此我们可以使用ROW_NUMBER()窗口函数提供一个过滤值。

作为一般规则,为所有窗口或分页查询指定要排序的列( ORDER BY) 以使结果可重复,这一点很重要。

由于没有提供模式,我已将其用作Name窗口排序的字段,请使用您想要的任何其他字段更新该(或问题),如果您没有其他事情可做, PK是一个很好的候选者.

SELECT * FROM
(
    SELECT *
    , ROW_NUMBER() OVER(PARTITION BY Country ORDER BY Name) AS _rn
    FROM Customers
    WHERE Country IN ('Germany', 'France', 'UK')
)
WHERE _rn = 1

PARTITION BY强制 对ROW_NUMBER所有具有相同值的记录进行计数,Country从 1 开始,因此在这种情况下,我们只选择行号(别名为_rn)为 1 的行。

WHERE如果您真的想要,该子句可以在外部查询中,但ROW_NUMBER()只能在查询的SELECTorORDER BY子句中指定,因此要将其用作过滤条件,我们不得不以某种方式包装结果。


推荐阅读