业务场景: 当业务在进行月报报表制作时,会有些模块是需要填充当前月的top问题单,那么这些问题单,在第一列就要给标记序列号从1开始的序号,所以这个序号是根据业务选择的问题单后,在根据当前问题单记录进行的序列号填充,比如有3条 那么就是1,2,3,如果业务要换问题单,那么进行替换,但是对应的这个序列依旧是从1开始排序的
所以这种情况下,序号和问题单是没有关联的,那么如何去给这一部分展示的top问题单增加序列号呢? 可以使用 row_number()函数
ROW_NUMBER()
直接在结果记录添加顺序排序序号
根据排序依据列的值进行连续的顺序排序
SELECT
ROW_NUMBER () over ( ORDER BY warn_date ) rowNum,
warn_no warnNo,
warn_status warnStatus,
date_format( warn_date, '%Y-%m-%d %H:%i:%s' ) warnDate
FROM
problem_warn_f
那么rowNum列就是对应的序号列了
RANK()
另外还有:根据排序依据列的值进行连续的顺序排序,但遇到值相同则序号相同
SELECT
rank() over ( ORDER BY warn_date ) rowNum,
warn_no warnNo,
warn_status warnStatus,
date_format( warn_date, '%Y-%m-%d %H:%i:%s' ) warnDate
FROM
problem_warn_f
可以看到,前面7条 根据日期字段排序,日期相同,序号都为1 ,到了第8条,时间不一样,那么序号就为8 ,会跳过2,3,4...序号 直接来到8
DENSE_RANK()
根据排序依据列的值进行连续的顺序排序,遇到值相同则序号相同,后续的序号会连续
SELECT
DENSE_RANK() over ( ORDER BY warn_date ) rowNum,
warn_no warnNo,
warn_status warnStatus,
date_format( warn_date, '%Y-%m-%d %H:%i:%s' ) warnDate
FROM
problem_warn_f
观察,第8个序号,接着是2,而不是8