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

SQL技术需求:处理重复文件夹数据,按指定规则返回用户值

解决方法:按优先级筛选文件夹对应的用户记录

嘿,我懂你卡在哪了——用窗口函数的时候,关键是要给非ADMIN的记录更高优先级,再结合分区来取第一条。我给你整理个靠谱的方案,咱们一步步来:

需求拆解先理清楚

咱们要实现的核心逻辑是:

  • 每个Folder只返回唯一一条记录
  • 优先抓取该文件夹下第一个出现的非'ADMIN'用户
  • 如果某个文件夹下所有记录的用户都是'ADMIN'(不管有没有重复),就返回'ADMIN'

正确的SQL实现(用CTE+窗口函数)

假设你的源表名叫folder_users,咱们用CTE给每条记录打上优先级标记,再筛选每个文件夹的第一条:

WITH ranked_records AS (
    SELECT 
        Folder,
        Users,
        -- 给非ADMIN的记录排优先级:1比2靠前
        CASE WHEN Users <> 'ADMIN' THEN 1 ELSE 2 END AS priority,
        -- 按原数据顺序给同文件夹的记录编号
        ROW_NUMBER() OVER (
            PARTITION BY Folder 
            ORDER BY 
                CASE WHEN Users <> 'ADMIN' THEN 1 ELSE 2 END,
                -- 这里如果有明确的顺序字段(比如创建时间、ID),替换成它更稳定
                (SELECT NULL)
        ) AS rn
    FROM folder_users
)
SELECT Folder, Users
FROM ranked_records
WHERE rn = 1;

代码逻辑解释

  1. 优先级标记:CASE WHEN Users <> 'ADMIN' THEN 1 ELSE 2 END确保所有非ADMIN的记录排在同文件夹的ADMIN记录前面
  2. 分区排序:PARTITION BY Folder把数据按文件夹分组,然后先按优先级排序,再按原数据顺序((SELECT NULL)表示沿用原表的存储顺序,如果你有比如created_at这类字段,换成它会更精准)给每组记录编号
  3. 筛选结果:取每组中编号为1的记录,就是咱们要的目标结果

用你的示例数据验证

拿你给的测试数据跑这个SQL,输出会是:

FolderUsers
JanuaryJOHN SMITH
January\DailyADMIN
January\Daily\SalesANDREW SMITH

完全符合你的需求对吧?

小提示

如果你的表有明确的“记录顺序”字段(比如自增ID、数据插入时间),一定要把(SELECT NULL)替换成那个字段,这样能保证每次取到的都是真正第一个出现的非ADMIN用户,避免因为数据库存储顺序变化导致结果不一致。

内容的提问来源于stack exchange,提问作者Terrence

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:17:24