Как найти максимальное количество счетчиков в группе, где счет рассчитывается с помощью функции в SQL? - PullRequest
0 голосов
/ 30 января 2019

У меня есть таблица, состоящая из customer_id и keyword_id.Существует несколько вариантов различных комбинаций customer_id и keyword_id, и я хочу найти наибольшее значение ключевого слова_id для каждого customer_id.Как мне это сделать?

   Customer_ID . Keyword_ID
      1                 a
      1                 a
      1                 a
      1                 b
      1                 b
      2                 c
      2                 c
      2                 c
      2                 d

Ожидаемый результат

Customer_ID .  Max_Keyword_ID . Count
1                 a                 3
2                 c                 3

Ответы [ 4 ]

0 голосов
/ 30 января 2019

Еще один способ сделать это, используя ROW_NUMBER() со столбцом PARTITION BY Customer_ID.

Вы можете попробовать выполнить следующие действия.

select *
from
(
    select *, row_number() over(partition by Customer_ID order by ct desc) rn
    from
    (
    select Customer_ID , Keyword_ID, count(*) ct
    from YOURTABLE
    GROUP BY Customer_ID , Keyword_ID
    ) t
) t1
where rn=1
0 голосов
/ 30 января 2019

Вы можете использовать count и dens_rank, чтобы получить ожидаемый результат.Получите ранг = 1, чтобы убедиться, что вы получаете строки, в которых у вас есть максимальное количество вхождений данного вывода.

with cte as (
  select  1 as customer_id, 'a' as Keyword_ID  union all 
 select  1 as customer_id, 'a' as Keyword_ID union all  
 select  1 as customer_id, 'a' as Keyword_ID union all  
 select  1 as customer_id, 'b' as Keyword_ID union all  
 select  1 as customer_id, 'b' as Keyword_ID union all  
 select  2 as customer_id, 'c' as Keyword_ID union all  
 select  2 as customer_id, 'c' as Keyword_ID union all  
 select  2 as customer_id, 'c' as Keyword_ID union all  
 select  2 as customer_id, 'd' as Keyword_ID) 

 SELECT customer_id, Keyword_ID, [COUNT]  FROM (
 select customer_id, Keyword_ID, count(1) [COUNT],
 dENSE_RANK() OVER (PARTITION BY customer_id ORDER BY COUNT(1) DESC) RANKED  from cte C 
 group by customer_id, Keyword_ID ) Z 
 WHERE Z.RANKED = 1 

Выход:

   customer_id  Keyword_ID  COUNT
      1            a         3
      2            c         3
0 голосов
/ 30 января 2019

Вы можете попробовать следующий запрос

 select Customer_ID,Keyword_ID,Count(Keyword_ID) as Count from tab group by 
    Customer_ID,Keyword_ID 
    Having Count(Keyword_ID)=( 
    SELECT MAX(mycount) 
    FROM ( 
    SELECT Keyword_ID, COUNT(Keyword_ID) mycount 
    FROM tab 
    GROUP BY Keyword_ID) checkMaxValue)

Нажмите здесь, чтобы посмотреть ссылку

0 голосов
/ 30 января 2019

Вы можете попробовать ниже - используя коррелированный подзапрос

with cte as
(
select Customer_ID,Keyword_ID,count(Keyword_ID) as cnt
from tablename
group by Customer_ID,Keyword_ID
)

select * from cte a where cnt in (select max(cnt) from cte b where a.Customer_ID=b.Customer_ID )
...