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

SQLite查询修复:按电视台筛选对应最高分辨率记录

修复SQLite查询以获取各电视台最高分辨率记录

原查询的问题分析

  1. 电视台名称(sender)提取错误:原数据格式为|DE|电视台名或|DE|电视台名 分辨率,原查询用SUBSTR(tvg_name, 1, INSTR(tvg_name, '|') - 1)提取sender,但tvg_name首字符就是|,导致提取结果为空,分组逻辑完全失效。
  2. 分辨率排序逻辑错误:直接用字符串MAX(quality)排序时,HD会被判定为比FHD优先级高(字符串字典序),和实际分辨率优先级(4K > FHD > HD > SD)不符。
  3. 未返回完整记录:原查询仅输出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:17:44