MySQL自定义变量自增——@rownum:= @rownum+1

博客介绍了在MySQL中利用自定义变量实现行号递增的方法。通过定义自定义变量@rownum保存表数据,用赋值语句@rownum:=@rownum + 1累加行号,还可使用CONCAT()函数连接字符串或字段。同时说明了相关语句的注意事项,该方法可用于获取行号或名次排列。

通过定义自定义变量@rownum来保存表中的数据。通过赋值语句
@rownum:=@rownum + 1 来累加达到递增行号的需求
注意:@rownum 是自定义变量而不是Mysql的函数,所以名字是可以随便取的比如@adc@行号@rowNo

 通过Mysql CONCAT()函数连接字符串,也可以连接多个字段CONCAT(字段A,字段B,字段C) as ‘三个字段合为一个’

SELECT
	CONCAT( '你是第: ', @rownum := @rownum + 1, " 名" ) AS '排名',
	b.type,
	b.NAME,
	b.description 
FROM
	tbl_book b,
	( SELECT @rownum := 0 ) r

 后半部分语句的 ( SELECT @rownum := 0 ) r 相当于创建了别名为:r 的新表,其表的列为@rownum,数值为0;
这里注意 ( SELECT @rownum := 0 ) r* 必须加括号且取表别名 否则会报错
通过利用变量将@rownum的行进行重新赋值,并显示。可以应用于获取行号或名次排列。

SQL执行结果

 

转载自:MySQL自定义变量自增——@rownum:= @rownum+1_mysql @rownum-优快云博客 

SELECT t1.F_DaTag, CASE WHEN q1_lower.F_AvgData IS NOT NULL AND q1_upper.F_AvgData IS NOT NULL THEN (q1_lower.F_AvgData + (q1_pos.q1_position - FLOOR(q1_pos.q1_position)) * (q1_upper.F_AvgData - q1_lower.F_AvgData)) * 2 ELSE NULL END AS daily_value FROM (SELECT DISTINCT F_DaTag FROM t_houraggregation) t1 LEFT JOIN ( -- 计算每个F_DaTag的数据量和Q1位置 SELECT F_DaTag, COUNT(*) AS total_count, (COUNT(*) + 1) * 0.25 AS q1_position FROM t_houraggregation WHERE F_DataDate BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 31 DAY) AND DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) GROUP BY F_DaTag ) q1_pos ON t1.F_DaTag = q1_pos.F_DaTag LEFT JOIN ( -- 获取Q1下限值(floor(q1_position)) SELECT t2.F_DaTag, t2.F_AvgData, @rownum := IF(@prev = t2.F_DaTag, @rownum + 1, 1) AS row_num, @prev := t2.F_DaTag FROM t_houraggregation t2 JOIN (SELECT @rownum := 0, @prev := '') r WHERE t2.F_DataDate BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 31 DAY) AND DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) ORDER BY t2.F_DaTag, t2.F_AvgData ) q1_lower ON t1.F_DaTag = q1_lower.F_DaTag AND q1_lower.row_num = FLOOR(q1_pos.q1_position) LEFT JOIN ( -- 获取Q1上限值(ceil(q1_position)) SELECT t2.F_DaTag, t2.F_AvgData, @rownum := IF(@prev = t2.F_DaTag, @rownum + 1, 1) AS row_num, @prev := t2.F_DaTag FROM t_houraggregation t2 JOIN (SELECT @rownum := 0, @prev := '') r WHERE t2.F_DataDate BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 31 DAY) AND DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) ORDER BY t2.F_DaTag, t2.F_AvgData ) q1_upper ON t1.F_DaTag = q1_upper.F_DaTag AND q1_upper.row_num = CEIL(q1_pos.q1_position);
08-09
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值