1

テーブルから何かの max(count(*)) を取得しようとしています。

私が実際にやろうとしているのは、顧客のお気に入りのブランドを引き出すことです. 彼らは年間 300 本の石けんを購入していますが、どの石けんがお気に入りなのか知りたいのです。したがって、基本的に max(count(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

前もって感謝します

4

2 に答える 2

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

一部の顧客に対して同じ数のブランドが複数ある場合、任意のレコードが 1 つになることに注意してください。すべてのレコードを取得する場合は、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

于 2013-11-08T08:46:09.390 に答える