按年月的时间顺序为表行分配编号
按年月的时间顺序为表行分配编号
嘿,我完全get到你的需求了——就是要让相同年月的所有行共享同一个编号,而且这个编号得按时间先后顺序递增,普通的索引列肯定满足不了,毕竟它是逐行加1,不管内容重复与否。下面给你分几种常用场景说解法:
如果你用的是SQL数据库
这时候窗口函数DENSE_RANK()绝对是你的救星!它能给每组相同的年月分配连续的唯一编号,关键是要先把你的Month/Year字符串转换成可正确排序的日期格式(避免英文名月份排序出错)。
举个MySQL的例子,假设你的表叫calendar_table:
SELECT `Month/Year`, DENSE_RANK() OVER (ORDER BY STR_TO_DATE(CONCAT('01 ', `Month/Year`), '%d %b/%Y')) AS `Count` FROM calendar_table;
不同数据库的日期转换函数略有不同:
- SQL Server可以用
CONVERT(DATE, '01 ' + [Month/Year], 106) - PostgreSQL用
TO_DATE('01 ' || "Month/Year", 'DD Mon/YYYY')
DENSE_RANK()会按日期的先后顺序,给每个不同的年月分配从1开始的连续编号,同一个年月的所有行都会拿到同一个编号,完美符合你的要求。
如果你用Excel/Power Query
Excel公式解法
假设你的Month/Year数据在A列(从A2开始),在B2单元格输入这个公式,然后下拉填充:
=SUMPRODUCT(1/COUNTIF(A$2:A2,A$2:A2))
这个公式的原理是统计到当前行为止,出现过的唯一年月数量,自然就是按顺序递增的编号,相同年月的行结果完全一致。
Power Query解法
- 先把
Month/Year列转换成日期类型(右键列 → 更改类型 → 日期,或者用自定义转换把字符串转成日期) - 点击「开始」选项卡 → 「分组依据」,分组列选
Month/Year,新列名设为Count,操作选「所有行」 - 给分组后的表添加一个索引列(从1开始)
- 展开「所有行」列,把索引列对应到每一行,最后删掉多余的列就行
这样处理后,相同年月的行就都会带上对应的连续编号啦~
备注:内容来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

