2016-10-24 12 views
1

のリターン(N)の行は、私はこのように、PHONE_NUMBERによって各contact_idの唯一の3つの数字、順序を返すようにしたい、このPostgresqlの各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 

のようなテーブルを持っている:

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

最適化されたクエリが必要です。このタイプのクエリを簡単にwindow functionsを使用して解決することができる

マイクエリ

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

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;