You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:47:57