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

SQLite按album分组时如何按优先级获取对应status的path字段值

解决方案

你可以通过CASE WHEN配合COALESCE函数实现优先级取值,该写法兼容所有SQLite版本,修改后的查询语句如下:

SELECT
    COALESCE(
        MAX(CASE WHEN status = 'REC' THEN status END),
        MAX(CASE WHEN status = 'INFO' THEN status END)
    ) AS status,
    COUNT(idFileRemote) AS count_idFileRemote,
    ROUND(AVG(rating), 2) AS rating,
    album,
    COALESCE(
        MAX(CASE WHEN status = 'REC' THEN coverhash END),
        MAX(CASE WHEN status = 'INFO' THEN coverhash END)
    ) AS coverhash,
    COALESCE(
        MAX(CASE WHEN status = 'REC' THEN path END),
        MAX(CASE WHEN status = 'INFO' THEN path END)
    ) AS path
FROM tracks
GROUP BY album;

逻辑说明

  • 用CASE WHEN筛选出对应status的字段值,非目标status的返回值为NULL
  • COALESCE函数会按顺序返回第一个非NULL的值:先取status为REC的对应字段值,如果为NULL(分组内无REC记录),再取status为INFO的对应字段值
  • 统计类聚合函数COUNT、AVG不受筛选影响,仍然计算分组内所有记录的统计结果

如果你使用的是SQLite 3.25.0及以上版本,也可以用窗口函数实现,逻辑更直观:

WITH ranked_tracks AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY album 
            ORDER BY CASE status 
                WHEN 'REC' THEN 1 
                WHEN 'INFO' THEN 2 
                ELSE 999 
            END ASC
        ) AS rn
    FROM tracks
)
SELECT 
    MAX(CASE WHEN rn = 1 THEN status END) AS status,
    COUNT(idFileRemote) AS count_idFileRemote,
    ROUND(AVG(rating), 2) AS rating,
    album,
    MAX(CASE WHEN rn = 1 THEN coverhash END) AS coverhash,
    MAX(CASE WHEN rn = 1 THEN path END) AS path
FROM ranked_tracks
GROUP BY album;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:45:05