Phoenix SQL如何按列A不同取值获取对应列B的首条查询结果
Phoenix SQL 按分组取首条记录实现方案
你需要实现的是按person、account两个字段分组后取每组第一条profile_pic记录,Phoenix有两种常用实现方式,都可以达到预期输出结果:
方案1:窗口函数方案(兼容性最好,Phoenix 4.8+支持)
通过ROW_NUMBER()窗口函数给每个分组内的记录打行号,过滤出行号为1的记录即为首条:
SELECT person, account, profile_pic FROM ( SELECT person, account, profile_pic, -- 按person+account分组,组内按你指定的规则排序生成行号 ROW_NUMBER() OVER (PARTITION BY person, account ORDER BY 排序字段 ASC) AS row_num FROM 你的表名 ) temp WHERE row_num = 1;
说明:
ORDER BY后替换为你判断首条的排序依据,比如按插入时间最早排序填create_time ASC,按行键顺序排序填ROWKEY ASC。
方案2:DISTINCT ON 方案(写法更简洁)
Phoenix支持类似PostgreSQL的DISTINCT ON语法,直接返回分组后的第一条记录:
SELECT DISTINCT ON (person, account) person, account, profile_pic FROM 你的表名 -- 必须先按分组字段排序,再按首条判断规则排序 ORDER BY person, account, 排序字段 ASC;
注意事项
- 必须显式指定排序规则,没有指定排序的情况下“首条”结果是随机不可控的,建议优先使用业务上有明确意义的字段作为排序依据
- 数据量较大时,建议给
person、account和排序字段建立联合索引,可大幅提升查询性能 - 如果需要取每组最后一条记录,把排序规则改为降序(
DESC)即可
内容的提问来源于stack exchange,提问作者Kimi
相关产品推荐
相关产品推荐

