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;
代码逻辑解释
- 优先级标记:
CASE WHEN Users <> 'ADMIN' THEN 1 ELSE 2 END确保所有非ADMIN的记录排在同文件夹的ADMIN记录前面 - 分区排序:
PARTITION BY Folder把数据按文件夹分组,然后先按优先级排序,再按原数据顺序((SELECT NULL)表示沿用原表的存储顺序,如果你有比如created_at这类字段,换成它会更精准)给每组记录编号 - 筛选结果:取每组中编号为1的记录,就是咱们要的目标结果
用你的示例数据验证
拿你给的测试数据跑这个SQL,输出会是:
| Folder | Users |
|---|---|
| January | JOHN SMITH |
| January\Daily | ADMIN |
| January\Daily\Sales | ANDREW SMITH |
完全符合你的需求对吧?
小提示
如果你的表有明确的“记录顺序”字段(比如自增ID、数据插入时间),一定要把(SELECT NULL)替换成那个字段,这样能保证每次取到的都是真正第一个出现的非ADMIN用户,避免因为数据库存储顺序变化导致结果不一致。
内容的提问来源于stack exchange,提问作者Terrence
相关产品推荐
相关产品推荐

