Oracle SQL需求:相同username仅在首行显示对应id
同username仅首次显示id的实现方法
针对你的需求,下面是几种主流数据库的具体实现方案:
MySQL 方案
利用ROW_NUMBER()窗口函数,按username分组后指定排序规则(用来定义「首次出现」的顺序),当行号为1时显示id,其余行显示NULL。
示例代码:
SELECT username, CASE WHEN ROW_NUMBER() OVER (PARTITION BY username ORDER BY id) = 1 THEN id ELSE NULL END AS id FROM your_table;
提示:ORDER BY id是默认用id排序来确定首次顺序,如果你有记录插入时间(比如create_time),换成ORDER BY create_time会更贴合实际插入顺序。
PostgreSQL 方案
逻辑和MySQL完全一致,窗口函数用法通用:
SELECT username, CASE WHEN ROW_NUMBER() OVER (PARTITION BY username ORDER BY id) = 1 THEN id ELSE NULL END AS id FROM your_table;
SQL Server 方案
同样使用窗口函数实现:
SELECT username, CASE WHEN ROW_NUMBER() OVER (PARTITION BY username ORDER BY id) = 1 THEN id ELSE NULL END AS id FROM your_table;
兼容老版本数据库的方案
如果你的数据库不支持窗口函数,可用子查询判断当前行是否为该username对应最小id的记录:
SELECT t1.username, CASE WHEN t1.id = (SELECT MIN(id) FROM your_table t2 WHERE t2.username = t1.username) THEN t1.id ELSE NULL END AS id FROM your_table t1;
注意:如果同一个username存在多个相同的最小id(一般id是主键不会出现这种情况),该方案会显示多个id,优先推荐窗口函数的方法。
内容的提问来源于stack exchange,提问作者User071295
相关产品推荐
相关产品推荐

