sql - 如何在 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% 的唯一身份访问者总数。
解决方案
这是一个棘手的问题。一种方法如下:
- 将数据减少到每个用户和关键字一行(如果没有重复则不需要)。
- 使用
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)
作为窗口函数。但是,有一些简单的解决方法。
推荐阅读
- wordpress - 如何向 WordPress Gutenberg 编辑器添加设置
- r - R中的子集函数适用于一列但不适用于另一列
- python - 带 GPIO LED 的闪烁 LED 脚本
- rest - REST API url 过滤设计
- java - 如何在使用 Javassist 生成的方法中使用对现有对象的引用
- python - 需要帮助在 python 中的字符串上使用索引
- handlebars.js - 将变量传递给车把中的局部变量
- php - 未定义的偏移量:最新版本升级后 WordPress 中的 0
- typescript - 函数可以返回没有 noUncheckedIndexedAccess 错误的映射元组吗?
- laravel - Laravel 我尝试复制一个对象并在每个对象中添加图片