SQLite查询修复:按电视台筛选对应最高分辨率记录
修复SQLite查询以获取各电视台最高分辨率记录
原查询的问题分析
- 电视台名称(sender)提取错误:原数据格式为
|DE|电视台名或|DE|电视台名 分辨率,原查询用SUBSTR(tvg_name, 1, INSTR(tvg_name, '|') - 1)提取sender,但tvg_name首字符就是|,导致提取结果为空,分组逻辑完全失效。 - 分辨率排序逻辑错误:直接用字符串
MAX(quality)排序时,HD会被判定为比FHD优先级高(字符串字典序),和实际分辨率优先级(4K > FHD > HD > SD)不符。 - 未返回完整记录:原查询仅输出sender和quality,无法得到你需要的完整
tvg_name条目。
解决方案
使用CTE(公共表表达式)结合窗口函数,先为每条记录标记电视台基础名称和分辨率优先级,再筛选出每个电视台优先级最高的记录:
WITH ranked_tv AS ( SELECT tvg_name, -- 提取电视台基础名称(去掉|DE|和分辨率后缀) CASE WHEN INSTR(SUBSTR(tvg_name, 5), ' ') > 0 THEN SUBSTR(SUBSTR(tvg_name, 5), 1, INSTR(SUBSTR(tvg_name, 5), ' ') - 1) ELSE SUBSTR(tvg_name, 5) END AS sender, -- 为分辨率分配优先级数值(数值越大优先级越高) CASE WHEN tvg_name LIKE '%4K' THEN 4 WHEN tvg_name LIKE '%FHD' THEN 3 WHEN tvg_name LIKE '%HD' THEN 2 ELSE 1 END AS quality_rank, -- 按电视台分组,分辨率优先级降序排序,标记每条记录的排名 ROW_NUMBER() OVER ( PARTITION BY CASE WHEN INSTR(SUBSTR(tvg_name, 5), ' ') > 0 THEN SUBSTR(SUBSTR(tvg_name, 5), 1, INSTR(SUBSTR(tvg_name, 5), ' ') - 1) ELSE SUBSTR(tvg_name, 5) END ORDER BY CASE WHEN tvg_name LIKE '%4K' THEN 4 WHEN tvg_name LIKE '%FHD' THEN 3 WHEN tvg_name LIKE '%HD' THEN 2 ELSE 1 END DESC ) AS rn FROM derek WHERE tvg_name LIKE '|DE%' ) -- 筛选每个电视台排名第一的记录(最高分辨率) SELECT tvg_name FROM ranked_tv WHERE rn = 1;
替代方案(不使用窗口函数)
如果你的SQLite版本不支持窗口函数,也可以用子查询筛选每个电视台的最高优先级分辨率,再关联原表获取完整记录:
WITH tv_quality AS ( SELECT tvg_name, CASE WHEN INSTR(SUBSTR(tvg_name, 5), ' ') > 0 THEN SUBSTR(SUBSTR(tvg_name, 5), 1, INSTR(SUBSTR(tvg_name, 5), ' ') - 1) ELSE SUBSTR(tvg_name, 5) END AS sender, CASE WHEN tvg_name LIKE '%4K' THEN 4 WHEN tvg_name LIKE '%FHD' THEN 3 WHEN tvg_name LIKE '%HD' THEN 2 ELSE 1 END AS quality_rank FROM derek WHERE tvg_name LIKE '|DE%' ) SELECT t.tvg_name FROM tv_quality t JOIN ( SELECT sender, MAX(quality_rank) AS max_rank FROM tv_quality GROUP BY sender ) m ON t.sender = m.sender AND t.quality_rank = m.max_rank;
结果验证
针对你提供的示例输入数据,上述两种查询都会输出:
|DE|ZDF HD |DE|RTL FHD |DE|SAT1
内容的提问来源于stack exchange,提问作者Derek Ziegler
相关产品推荐
相关产品推荐

