MySQL通过虚拟列相邻行数据处理
创始人
2025-06-01 02:38:09
0

MySQL通过虚拟列相邻行数据处理

1、问题描述

需要比较同一个表中相邻两行的数据差异,做数据处理。

2、数据环境

表结构如下:

mysql> desc bigdata;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| str_info  | varchar(16) | YES  | MUL | NULL    |       |
| sys_date  | datetime    | YES  | MUL | NULL    |       |
| sys_year  | int(11)     | YES  |     | NULL    |       |
| sys_month | int(11)     | YES  |     | NULL    |       |
| sys_week  | int(11)     | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

数据如下所示:


mysql> select * from bigdata limit 3;
+------------------+---------------------+----------+-----------+----------+
| str_info         | sys_date            | sys_year | sys_month | sys_week |
+------------------+---------------------+----------+-----------+----------+
| 11A1EA00347BE1B6 | 2017-12-27 08:47:10 |     2017 |        12 |       52 |
| 7CEFF8E8ED098F65 | 2018-05-21 07:11:14 |     2018 |         5 |       20 |
| 96ABCEC7FDCE638C | 2018-12-17 09:29:18 |     2018 |        12 |       50 |
+------------------+---------------------+----------+-----------+----------+
3 rows in set (0.00 sec)

需求:
按时间排序后,把str_info相邻两行合并。

3、虚拟列

通过select @arownum:=0 做虚拟表,和数据表关联后,增加一个虚拟列rownum :

mysql> select @arownum:=@arownum+1 rownum,t.* from bigdata t,(select @arownum:=0) a order by t.sys_date limit 3;
+--------+------------------+---------------------+----------+-----------+----------+
| rownum | str_info         | sys_date            | sys_year | sys_month | sys_week |
+--------+------------------+---------------------+----------+-----------+----------+
|      1 | 13034E50378C24F9 | 2017-01-01 00:00:10 |     2017 |         1 |        1 |
|      2 | B7E9CA875F6D362E | 2017-01-01 00:00:16 |     2017 |         1 |        1 |
|      3 | 01EEAD2F6A7BB2A5 | 2017-01-01 00:00:16 |     2017 |         1 |        1 |
+--------+------------------+---------------------+----------+-----------+----------+
3 rows in set, 2 warnings (0.00 sec)

4、相邻行处理

在上面的语句上,做成两个临时表,利用行号差进行对比。
第一个临时表,select @arownum:=0,序号从1开始;
第二个临时表,select @brownum:=1,序号从2开始;
所以,按序号关联第一个临时表的当前,第二个临时表为之前。把信息字符串合并。

select t1.str_info cur_info, t1.sys_date cur_date,t2.sys_date
pre_date, t2.str_info pre_info ,concat(t1.str_info,t2.str_info) as
concatinof from (select @arownum:=@arownum+1 rownum,t.* from bigdata
t,(select @arownum:=0) a order by t.sys_date limit 5) t1 , (select
@brownum:=@brownum+1 rownum,t.* from bigdata t,(select @brownum:=1) b
order by t.sys_date limit 5) t2 where t1.rownum=t2.rownum;

mysql> select t1.str_info cur_info, t1.sys_date cur_date,t2.sys_date pre_date, t2.str_info pre_info ,concat(t1.str_info,t2.str_info) as concatinof from -> (select @arownum:=@arownum+1 rownum,t.* from bigdata t,(select @arownum:=0) a order by t.sys_date limit 5) t1 ,-> (select @brownum:=@brownum+1 rownum,t.* from bigdata t,(select @brownum:=1) b order by t.sys_date limit 5) t2-> where t1.rownum=t2.rownum;
+------------------+---------------------+---------------------+------------------+----------------------------------+
| cur_info         | cur_date            | pre_date            | pre_info         | concatinof                       |
+------------------+---------------------+---------------------+------------------+----------------------------------+
| B7E9CA875F6D362E | 2017-01-01 00:00:16 | 2017-01-01 00:00:10 | 13034E50378C24F9 | B7E9CA875F6D362E13034E50378C24F9 |
| 01EEAD2F6A7BB2A5 | 2017-01-01 00:00:16 | 2017-01-01 00:00:16 | B7E9CA875F6D362E | 01EEAD2F6A7BB2A5B7E9CA875F6D362E |
| DF5674B2AD590C2B | 2017-01-01 00:00:18 | 2017-01-01 00:00:16 | 01EEAD2F6A7BB2A5 | DF5674B2AD590C2B01EEAD2F6A7BB2A5 |
| 171A3E61A84EE8EC | 2017-01-01 00:00:18 | 2017-01-01 00:00:18 | DF5674B2AD590C2B | 171A3E61A84EE8ECDF5674B2AD590C2B |
+------------------+---------------------+---------------------+------------------+----------------------------------+
4 rows in set, 4 warnings (0.00 sec)mysql> 

MySQL通过虚拟列相邻行数据处理,重点还是在于rownum行号的处理上。

相关内容

热门资讯

“强实名”仍一票难求?遏制技术... 暑期来临,演唱会、音乐节、话剧等演出活动热度飙升。无论手速多快,总是一票难求,让众多消费者叫苦不迭。...
上证红利回报指数上涨0.83%... 金融界7月21日消息,上证指数高开高走,上证红利回报指数 (上红回报,H50019)上涨0.83%,...
为啥股票与基金的走势相反? 虚位以待! 平姐姐摄于毛里求斯网红酒店 昨天的文章,标题就很明确,那就是《准备出击》,在半年报不少上...
美加密货币相关法案落地引发三连... 当地时间7月18日,美国总统特朗普在白宫正式签署《指导与建立美国稳定币国家创新法案》(简称《天才法案...
股市必读:湖南黄金(00215... 截至2025年7月21日收盘,湖南黄金(002155)报收于18.33元,上涨2.57%,换手率3....
四川发布六大红色旅游新线路 四川发布六大红色旅游新线路 “锦绣天府·安逸四川”之红色旅游央地媒体联动采访启动 “锦绣天府·安...
北交所上市公司中航泰达大宗交易... 每经讯,2025年7月21日,北交所上市公司中航泰达(836263,收盘价:16.11元)发生一笔大...
金价突然猛拉,重回3400美元... 记者丨叶麦穗 编辑丨曾芳 金珊 7月21日晚,现货黄金突然猛拉大涨,截至22:40,涨超1.5%,站...
嘉实港股互联网产业核心资产混合... AI基金嘉实港股互联网产业核心资产混合A(011924)披露2025年二季报,第二季度基金利润532...
中信证券:特朗普“唱白脸”+贝... 来源:市场资讯 中信证券研究 文|李翀 崔嵘 韦昕澄 贾天楚 当地时间7月14日,美国总统特朗普表示...
机器人ETF易方达(15953... 截至收盘,国证机器人产业指数上涨2.1%,中证装备产业指数上涨1.9%,中证军工指数上涨0.9%,中...
北京工商大学教授吕来明:整治“... 今年以来,治理“内卷式”竞争引发高度关注。从水泥、光伏、汽车到电商,多个领域吹响“反内卷”的号角。 ...
民航局:加快新兴市场布局,提升... 7月21日,在国新办举行的“高质量完成‘十四五’规划”系列主题新闻发布会上,中国民航局局长宋志勇介绍...
二季度券商北交所、新三板业务执... 头部券商优势地位保持稳固,多家中小券商排名大幅跃升 本报记者 于宏 7月18日晚间,北交所、全国股转...
股票行情快报:美新科技(301... 证券之星消息,截至2025年7月21日收盘,美新科技(301588)报收于19.0元,上涨1.39%...
破解中小企业融资难!产业数字金... “中国经济的核心在于产业经济,产业经济离不开金融,产业经济、产业金融都离不开数字技术的赋能,中小企业...
京东美团“暗战”具身智能,战火... 在科技赛道的激烈角逐中,具身智能正成为巨头们争夺的新焦点。王兴之后,刘强东也在具身智能领域强势出击。...
“未来已来”指数涨跌不一,关注... 截至收盘,国证机器人产业指数上涨2.1%,中证新能源指数上涨1.5%,中证人工智能主题指数下跌0.0...
“未来能源”指数上涨,关注新能... 截至收盘,中证上海环交所碳中和指数上涨1.9%,中证光伏产业指数上涨1.6%,中证新能源指数上涨1....