sql - PostgreSQL 中不同值的 LIMIT

标签 sql postgresql

我有一个电话号码与此类似的联系人表:

Name    Phone
Alice   11
Alice   33
Bob     22
Bob     44
Charlie 12
Charlie 55

我不知道如何查询这样一个表,不仅通过简单的计数而且通过不同的名称来限制行。例如,如果我有一个神奇的 LIMIT_BY 子句,它会像这样工作:

SELECT * FROM "Contacts" ORDER BY "Phone" LIMIT_BY("Name") 1

Alice 11
Alice 33
-- ^ only the first contact


SELECT * FROM "Contacts" ORDER BY "Phone" LIMIT_BY("Name") 2

Alice   11
Charlie 12
Alice   33
Charlie 55
-- ^ now with Charlie because his phone 12 goes right after 11. Bob isn't here because he's third, beyond the limit

我怎样才能达到这个结果?

换句话说,选择包含按电话排序的前 N ​​个不同名称的所有行

最佳答案

我认为 PostgreSQL 没有提供任何特别有效的方法来执行此操作,但对于 6 行,它不需要非常有效。您可以执行子查询来计算您想要查看哪些人,然后将该子查询连接回完整表。

select * from 
"Contacts" join
(select name from "Contacts" group by name order by min(phone) limit 2) as limited 
using (name)

您可以将子查询放在 IN 列表中而不是 JOIN 中,但这通常性能更差。

关于sql - PostgreSQL 中不同值的 LIMIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67248525/

相关文章:

Java Date - 插入数据库

mysql - 通过 PhpMyAdmin 执行简单的 SQL 查询时遇到的问题

sql - 选择提供的列表中 jsonb 字段所在的行

sql - PostgreSQL:如何合并多行?

java - 想要一个 SQL 查询来了解当前 JDBC 连接命中的 Oracle RAC 节点

java - JOOQ:如何将记录映射到别名表(来自嵌套查询)

MySql 查询 : Get sum of N rows where N is defined in another column value

node.js - 使用 sequelize 复制外键列

java - ‘pgp_sym_encrypt’和 ‘pgp_sym_decrypt’带有HSM(硬件安全模块)的机制

swift - Heroku Vapor服务器崩溃: Possible Postgres Library Issue?