Найдите наиболее распространенный varchar из группы пользователей, используя SQL - PullRequest
0 голосов
/ 17 марта 2020

У меня тысячи пользователей, и я пытаюсь найти их наиболее распространенный сегмент. Данные выглядят так:

User               Segment
User 1               Good
User 1               Good
User 1               Poor
user 2               Medium
user 2               Medium
User 3               Poor

В этом случае код sql вернется:

Хорошо для пользователя 1

Средний для пользователя 2

Плохо для пользователя 3

Я пытался использовать функцию Max, но она возвращает только строку в алфавитном порядке c, а не самую распространенную строку, связанную с каждым пользователем. Как к сведению, сегмент может часто меняться между пользователями. Таким образом, очень вероятно, что он может измениться 8-10 раз, но ищет тот, который представляет их наиболее.

Спасибо!

Ответы [ 3 ]

1 голос
/ 17 марта 2020

Вы можете использовать агрегацию, например так:

select user,
       coalesce(max(case when segment = 'Good' then segment end),
                max(case when segment = 'Medium' then segment end),
                max(case when segment = 'Poor' then segment end)
               )
from t
group by user;
1 голос
/ 17 марта 2020

Поскольку window functions применяются после group by, вы также можете сделать, как показано ниже. Вы можете заменить row_number() функцией rank() или dense_rank() в зависимости от того, как вы хотите иметь дело со связями.

select user, segment 
from
(select user, segment, row_number() over (partition by user order by count(*) desc) as rn
from your_table 
group by user, segment) t
where rn=1
1 голос
/ 17 марта 2020

Для этого можно использовать функции row_number() и count() analyti c:

select user,segment 
from (
  select user, segment, cnt,
    row_number() over(partition by user,segment order by cnt desc) as rn 
  from (
    select user, segment,
      count(segment) over(partition by user,segment) as cnt 
    from table) t1
  ) t2
where rn = 1;
...