Postgresql - 每个 ID 的 Return (N) 行

Postgresql - Return (N) rows for each ID

我有一个table这样的

contact_id |  phone_number 
         1 |  55551002
         1 |  55551003
         1 |  55551000
         2 |  55552001
         2 |  55552008
         2 |  55552003
         2 |  55552007
         3 |  55553001
         3 |  55553002
         3 |  55553009
         3 |  55553004
         4 |  55554000

我想 return 每个 contact_id 只有 3 个号码,按 phone_number 排序,像这样:

contact_id | phone_number
         1 |  55551000
         1 |  55551002
         1 |  55551003
         2 |  55552001
         2 |  55552003
         2 |  55552007
         3 |  55553001
         3 |  55553002
         3 |  55553004
         4 |  55554000

请优化查询。

我的查询

SELECT a.cod_cliente, count(a.telefone) as qtd
FROM crm.contatos a
  LEFT JOIN (
    SELECT *
    FROM crm.contatos b
    LIMIT 3
  ) AS sub_contatos ON sub_contatos.cod_contato = a.cod_cliente
group by a.cod_cliente;

此类查询可以使用 window functions:

轻松解决
select contact_id, phone_number
from (
  select contact_id, phone_number, 
         row_Number() over (partition by contact_id order by phone_number) as rn
  from crm.contatos
) t
where rn <= 3
order by contact_id, phone_number;