【问题标题】:Find the most common varchar from a group of users using SQL使用 SQL 从一组用户中查找最常见的 varchar
【发布时间】:2020-03-17 15:05:03
【问题描述】:

我有成千上万的用户,我正在努力寻找他们最常见的细分市场。数据如下所示:

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 函数,但这仅返回按字母顺序排列的字符串,而不是与每个用户关联的最常见的字符串。仅供参考,该细分在用户之间经常会发生变化。所以它很可能会改变 8-10 次,但要寻找最能代表他们的那个。

谢谢!

【问题讨论】:

  • 如果添加(用户 3,Good),预期的结果是什么?

标签: sql postgresql frequency topmost


【解决方案1】:

你可以像这样使用聚合:

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;

【讨论】:

    【解决方案2】:

    您可以使用row_number()count() 分析函数来执行此操作:

    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;
    

    【讨论】:

      【解决方案3】:

      由于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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多