如何合并SQL查询:获取TOP1000高收入用户及自定义用户ID
合并TOP1000高收入用户与自定义用户列表的SQL方案
嘿,这个需求我熟得很!要把按REVENUE降序的TOP1000用户,和指定自定义USER_ID列表里不在这个TOP1000的用户合并成一个查询,咱们可以用子查询+UNION ALL的组合来实现,既能避免重复数据,还能兼顾性能。
基础实现方案(适用于SQL Server等支持TOP语法的数据库)
这个写法先获取TOP1000高收入用户,再筛选出自定义列表里不在这个TOP1000的用户,最后用UNION ALL合并(比UNION更高效,因为我们已经手动过滤了重复,不需要数据库额外做去重排序):
-- 第一步:获取按REVENUE降序的TOP1000用户 SELECT TOP 1000 * FROM XX ORDER BY REVENUE DESC UNION ALL -- 第二步:获取自定义列表中不在TOP1000里的用户 SELECT * FROM XX WHERE USER_ID IN (CUSTOM_LIST) AND USER_ID NOT IN ( -- 复用TOP1000的用户ID,避免重复数据 SELECT TOP 1000 USER_ID FROM XX ORDER BY REVENUE DESC )
优化版(用CTE减少重复查询,提升性能)
如果你的数据库支持公共表表达式(CTE,比如SQL Server、PostgreSQL、MySQL 8.0+),可以把TOP1000的用户数据存成临时CTE,避免两次执行TOP1000查询,性能会更好:
WITH Top1000Users AS ( SELECT TOP 1000 * FROM XX ORDER BY REVENUE DESC ) -- 先取TOP1000用户 SELECT * FROM Top1000Users UNION ALL -- 再取自定义列表中不在TOP1000的用户 SELECT * FROM XX WHERE USER_ID IN (CUSTOM_LIST) AND USER_ID NOT IN (SELECT USER_ID FROM Top1000Users)
适配其他数据库的写法
如果是MySQL,需要把TOP 1000换成LIMIT 1000:
WITH Top1000Users AS ( SELECT * FROM XX ORDER BY REVENUE DESC LIMIT 1000 ) SELECT * FROM Top1000Users UNION ALL SELECT * FROM XX WHERE USER_ID IN (CUSTOM_LIST) AND USER_ID NOT IN (SELECT USER_ID FROM Top1000Users)
如果是Oracle,需要用ROWNUM来实现TOP逻辑:
WITH Top1000Users AS ( SELECT * FROM ( SELECT * FROM XX ORDER BY REVENUE DESC ) WHERE ROWNUM <= 1000 ) SELECT * FROM Top1000Users UNION ALL SELECT * FROM XX WHERE USER_ID IN (CUSTOM_LIST) AND USER_ID NOT IN (SELECT USER_ID FROM Top1000Users)
小提示
- 如果你的自定义列表里的用户允许重复出现(比如即使在TOP1000里也想再显示一次),可以去掉
AND USER_ID NOT IN (...)的条件,直接用UNION ALL合并两个查询即可。 UNION ALL比UNION性能更好,因为UNION会自动去重并排序,而我们已经通过子查询过滤了重复,所以优先用UNION ALL。
内容的提问来源于stack exchange,提问作者user8937713
相关产品推荐
相关产品推荐

