sql - 从两个字段中选择第一个不同的值

标签 sql database postgresql select

这看起来非常简单,但我只是没把它放在一起。说我有值(value)观

 a | b
---+---
 1 | 10
 1 | 20
 2 | 10
 2 | 20

如何从此表中进行选择,以便在表中获取这些值:

 a | b
---+---
 1 | 10
 2 | 20

这同样适用于:

 a | b
---+---
 1 | 10
 1 | 20
 1 | 30
 2 | 10
 2 | 20
 2 | 30
 3 | 10
 3 | 20
 3 | 30

得到

 a | b
---+---
 1 | 10
 2 | 20
 3 | 30

我已经尝试了 distinct on 和 order by 的不同组合,但是这些都行不通,因为它确实需要在 a 和 b 上都是不同的。也许是一个窗口函数......?如果重要,请使用 postgres。

最佳答案

我不确定distinct在这里是正确的术语,但如果我理解正确的话,你有一组 a 和 b 的值,以及每个组合的行,你想匹配第一个 a 和第一个 b,第二个 a 和第二个 b,等等。一种方法是使用窗口函数来 rank两列,然后只查询排名相等的行:

SELECT a, b
FROM   (SELECT a, RANK() OVER (ORDER BY a) AS rank_a,
               b, RANK() OVER (ORDER BY b) AS rank_b
        FROM   myable) t
WHERE  rank_a = rank_b

关于sql - 从两个字段中选择第一个不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38486231/

相关文章:

java - 提示HINT_PASS_DISTINCT_THROUGH可将PageRequest的每页返回的实体数量降低到低于配置的页面大小(PostgreSQL)

sql - 使用 Raiserror 显示进度消息

java - hibernate :创建名称为小写的表

database - 升级黑莓数据库

mysql - 如何使用 Express 连接 Node.js 和 MySQL 8.0?

sql - 获取停止(第 x 行)和开始(第 x+1 行)之间的时间间隔

mysql - 如何在 MySQL 的 utf-8 列中识别语言

sql - 是否有与 SQL Profiler 等效的 IBM Iseries/DB2?

MySQL JOINS 不带 where 子句

postgresql - 我从查询 COUNT ('e.id' ) 或 COUNT(e.id) 得到不同的结果