2016-10-24 3 views
1

У меня есть таблица, как этотPostgresql - Return (N) строк для каждого ID

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 

Я хочу вернуть только 3 числа каждого contact_id, порядка по 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; 

ответ

3

Этот тип запроса может быть легко решена с помощью 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; 

 Смежные вопросы

  • Нет связанных вопросов^_^