考虑下表:
SELECT id, value FROM table ORDER BY id ASC;
+-----+---------+
| id | value |
+-----+---------+
| 12 | 158 |
| 15 | 346 |
| 27 | 334 |
| 84 | 378 |
| 85 | 546 |
+-----+---------+
The id
列自动递增但包含间隙。这value
列是数字。
我想看看增加的情况value
随着时间的推移,通过设置value
与value
上面两行。那是对于行id=85
我想设置value
of row id=85
【546】关于value
of row id=27
(334)。要计算的行值id=85
因此 546/334=1.63473。
这是我想要达到的结果:
SELECT id, value, ...;
+-----+---------+---------------------+
| id | value | value/lag(value, 2) | (the syntax value/lag(value, 2) is made up)
+-----+---------+---------------------+
| 12 | 158 | NULL |
| 15 | 346 | NULL |
| 27 | 334 | 2.11392 | (334/158=2.11392)
| 84 | 378 | 1.09248 | (378/346=1.09248)
| 85 | 546 | 1.63473 | (546/334=1.63473)
+-----+---------+---------------------+
如何在 MySQL 中执行此类滞后?
请注意,id
列包含间隙,因此只需使用以下命令连接同一张表即可t1.id = t2.id - 2
不管用。
这是一个在 MySQL 中返回你想要的内容的解决方案
SET @a :=0;
SET @b :=2;
SELECT r.id, r.value, r.value/r2.value AS 'lag'
FROM
(SELECT if(@a, @a:=@a+1, @a:=1) as rownum, id, value FROM results) AS r
LEFT JOIN
(SELECT if(@b, @b:=@b+1, @b:=1) as rownum, id, value FROM results) AS r2
ON r.rownum = r2.rownum
MySQL 5.1 不喜欢针对子查询的自连接,因此您必须对行进行两次计数,因此不像它可能的那样整洁或可扩展,但它确实使指定滞后变得简单。
对于使用 Oracle 的读者来说,这要容易得多
SELECT id, value, value/lag(value, 2) over (order by id) as lag from results;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)