首页 > 解决方案 > 如何在 SQL 中显示覆盖总访问者 50% 的前几行

问题描述

问题:我想从与搜索关键字指标相关的表中获取一组数据。我只想获取覆盖 50% 的唯一身份访问者总数的关键字。整体代码如下 -

  SELECT  se_keyword
        ,COUNT(DISTINCT visitor_id) AS Distinct_Visitors
FROM    search_table
WHERE   DATE >= '20210207'
GROUP BY se_keyword
ORDER BY Distinct_Visitors DESC

这将针对搜索关键字显示具有唯一访问者的所有关键字。但我只想显示基于唯一身份访问者的热门关键字,这些关键字将涵盖 50% 的唯一身份访问者总数。

标签: sql

解决方案


这是一个棘手的问题。一种方法如下:

  • 将数据减少到每个用户和关键字一行(如果没有重复则不需要)。
  • 使用count(distinct)窗口函数计算重复次数的总和。
  • 过滤您想要的条件。

这是逻辑的样子:

select distinct ku.keyword, ku.running_num_users
from (select ku.*,
             count(distinct userid) over (order by num_users desc) as running_num_users,
             count(distinct userid) as num_users_overall
      from (select keyword, userid,
                   count(*) over (partition by keyword) as num_users
            from t
            group by keyword, userid
           ) ku
     ) ku
where running_num_users <= 0.5 * num_users_overall;

请注意,并非所有数据库都支持count(distinct)作为窗口函数。但是,有一些简单的解决方法。


推荐阅读