2013-11-08 2 views
1

Я ищу, чтобы вытащить max (count (*)) чего-то из таблицы.Максимальный счетчик - PostgreSQL

Фактически, что я пытаюсь сделать, это вытащить любимый бренд клиентов. Поэтому они покупают 300 баров мыла в год, но я хотел бы узнать, кто их любимый. Таким образом, максимальная (количество (Brand_ID) в основном

Я думал сделать это следующим образом:.

SELECT 
transaction.customer_id, 
max(occ) 
FROM 
( SELECT 
    transaction.customer_id, 
    count(transaction.brand_id) as occ, 
    FROM 
    transaction 

    GROUP BY 
    transaction.customer_id, 

) AS foo 
GROUP BY 
transaction.customer_id 

Спасибо заранее

ответ

0

или like this

with cte as (
    SELECT 
     transaction.customer_id, 
     count(transaction.brand_id) as occ, 
     FROM 
     transaction 

     GROUP BY 
     transaction.customer_id 
    ) 

    select max(occ) from cte 
+0

Будет ли это работать в PostgreSQL? Я продолжаю получать сообщение об ошибке «AS» –

+0

@QuinnOlive: да, это должно работать с любой поддерживаемой версией. CTE, где введено 8.4. –

+0

Ahhh. Мудак. Мой сервер postgreSQL равен 8.3:/ –

1

вы можете это сделать например:

with cte as (
    select customer_id, brand_id, count(*) as cnt 
    from test1 
    group by customer_id, brand_id 
) 
select distinct on (customer_id) 
    customer_id, brand_id, cnt 
from cte 
order by customer_id, cnt desc 

Имейте в виду, что если у одного клиента есть более одного бренда с равным счетом, вы получите одну произвольную запись. Если вы хотите, чтобы получить все записи, использование DENSE_RANK функция():

with cte1 as (
    select customer_id, brand_id, count(*) as cnt 
    from test1 
    group by customer_id, brand_id 
), cte2 as (
    select 
     customer_id, brand_id, 
     dense_rank() over(partition by customer_id order by cnt desc) as rn 
    from cte1 
) 
select customer_id, brand_id 
from cte2 
where rn = 1 

sql fiddle demo

Для PostgreSQL 8.3:

select distinct on (customer_id) 
    customer_id, brand_id, cnt 
from (
    select customer_id, brand_id, count(*) as cnt 
    from test1 
    group by customer_id, brand_id 
) as c 
order by customer_id, cnt desc; 

sql fiddle demo

+0

Будет ли это работать на PostgreSQL? –

+0

@QuinnOlive да, проверьте скрипт sql –

+0

Мой PostgreSQL имеет к сожалению:/ –

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