如何按特定列值添加自定义索引?附演员表需求示例
这问题我熟!要给每个演员分配专属的唯一编号,同时保证同一个演员不管对应多少部电影,编号都完全一致,用SQL的窗口函数+分组关联就能轻松搞定,我给你两种适配不同需求的解法:
按演员姓名排序分配编号
如果希望编号按照演员姓名的字母顺序生成,可以用下面的SQL:
SELECT original.id, original.actor_name, actor_numbers.actor_number FROM your_table original INNER JOIN ( -- 先给每个唯一演员分配编号 SELECT actor_name, ROW_NUMBER() OVER (ORDER BY actor_name) AS actor_number FROM your_table GROUP BY actor_name ) actor_numbers ON original.actor_name = actor_numbers.actor_name;
按演员首次出现顺序分配编号
如果想按照演员在表中第一次出现的顺序(也就是对应最小电影ID的顺序)生成编号,就用这个版本,刚好匹配你给出的示例结果:
SELECT original.id, original.actor_name, actor_numbers.actor_number FROM your_table original INNER JOIN ( SELECT actor_name, ROW_NUMBER() OVER (ORDER BY MIN(id)) AS actor_number FROM your_table GROUP BY actor_name ) actor_numbers ON original.actor_name = actor_numbers.actor_name;
简单说下逻辑:
- 子查询
actor_numbers先通过GROUP BY actor_name筛选出所有唯一的演员,再用ROW_NUMBER()窗口函数给每个演员生成专属编号。 - 最后把这个子查询的结果和原表通过
actor_name关联,就能把编号对应到每一行数据上了。
用你给的测试数据跑第二个SQL,得到的结果就是你想要的:
| id | actor_name | actor_number |
|---|---|---|
| 5 | Al pacino | 1 |
| 6 | Tim Roth | 2 |
| 7 | Antonio Banderas | 3 |
| 8 | Al pacino | 1 |
内容的提问来源于stack exchange,提问作者Vlad Matao
相关产品推荐
相关产品推荐

