如何用SQL按自定义优先级筛选各用户最高质量的data_src数据?
解决方案
核心思路是手动定义优先级权重,结合窗口函数筛选每个用户的最高优先级数据,具体实现如下:
方法:CASE + 窗口函数ROW_NUMBER()
先通过CASE语句为每个data_src赋予对应的优先级分数(分数越高优先级越高),再用ROW_NUMBER()按用户分组、优先级降序排序,最后取每组排序第一的记录。
完整SQL代码
WITH ranked_data AS ( SELECT data_src, data, users, -- 手动指定优先级分数,srcA最高,NULL最低 ROW_NUMBER() OVER ( PARTITION BY users ORDER BY CASE data_src WHEN 'srcA' THEN 4 WHEN 'srcB' THEN 3 WHEN 'srcC' THEN 2 ELSE 1 END DESC ) AS rank_num FROM your_table_name ) SELECT data_src, data, users FROM ranked_data WHERE rank_num = 1;
代码解释
CASE语句:为每个data_src映射明确的优先级分数,完全脱离字母排序限制,精准匹配需求中的优先级规则。PARTITION BY users:按用户维度分组,确保每个用户的记录单独进行优先级排序。ORDER BY ... DESC:让优先级高的记录排在分组内的最前列。ROW_NUMBER():为每组内的记录按优先级顺序编号,编号为1的就是该用户对应的最高质量数据。
验证结果
代入示例数据后,查询返回结果与预期完全一致:
data_src data users srcA x user1 srcC z user2
补充说明
如果同一用户下存在多条相同最高优先级的data_src(比如同一用户有两条srcA记录),ROW_NUMBER()会随机选取一条;若想保留所有同优先级的记录,可将ROW_NUMBER()替换为RANK()函数,筛选条件保持rank_num = 1即可。
内容的提问来源于stack exchange,提问作者drdot
相关产品推荐
相关产品推荐

