postgresql - 在查看 WHERE 子句中的多个 OR/IN 条件时如何将每个条件限制为一个结果(Postgresql)
问题描述
例如:
SELECT * FROM Customers
WHERE Country IN ('Germany', 'France', 'UK')
我想在我的 IN 子句中为每个国家/地区限制 1 个,所以我只看到总共 3 行:每个国家的一个客户(1 个德国人,1 个法国人,1 个英国人)。有没有一种简单的方法可以做到这一点?
解决方案
通常,对于这种类型的解决方案,一个简单的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()
只能在查询的SELECT
orORDER BY
子句中指定,因此要将其用作过滤条件,我们不得不以某种方式包装结果。
推荐阅读
- html - “react-native-maps”中的 MapView 未正确加载
- symfony - Symfony 4.4 上的 Encore:Tapable 插件的问题
- python - 如何使用 seaborn.FacetGrid 绘制不同的数据列?
- javascript - 从 Vue.js 中的外部文件中获取数据
- python - 是否可以使用带有 QDoubleSpinBox Value Changed 的 lamba 与 if 条件一起做某事?
- powershell - 如何使用 power shell 将 150 多个组的 ManagedBy 所有者从一个用户更改为另一个用户
- reactjs - 我无法在 react.js 中更新我的状态数据
- linux - 将 cat 输出重定向到 bash 脚本
- java - 空对象引用上的 java.lang.NullPointerException。在firebase android studio中访问“kelas”时
- meshlab - 用于拆分对象的本机 linux 软件