MySQL - 如何在 select 语句中设置变量值?

标签 mysql

我想获取上一行、当前行的值,并将它们相加。如果没有上一行,那么我会将 previous 设置为 0。这是我尝试过的。

SET @previous = CASE WHEN (SELECT MAX(value) FROM table WHERE dateTime < '2018-07-01') IS NULL 
THEN 0 
ELSE (SELECT MIN(value) FROM table WHERE dateTime BETWEEN '2018-07-01' AND '2018-07-30') 
END;

SELECT @previous AS Previous, 
@previous:=MAX(value) AS Current, 
(@previous + MAX(value)) AS Joined
FROM table 
WHERE dateTime BETWEEN '2018-07-01' AND '2018-07-30'
GROUP BY dateTime;

表格内容如下:

dateTime   | value 
2018-07-01 | 1
2018-07-01 | 1.2
2018-07-02 | 1.7
2018-07-03 | 2.1
2018-07-05 | 2.6
2018-07-05 | 3
2018-07-06 | 3.5

不幸的是,设置@previous:=MAX(value) 不会改变下一行的@previous 值,如果它在初始化时为0,它将保持为0。示例结果:

dateTime   | Previous | Current | Joined
2018-07-01 | 0        | 1.2     | 1.2
2018-07-02 | 0        | 1.7     | 1.7
2018-07-03 | 0        | 2.1     | 2.1
2018-07-05 | 0        | 4       | 4
2018-07-06 | 0        | 4       | 4

预期结果

dateTime   | Previous | Current | Joined
2018-07-01 | 0        | 1.2     | 1.2
2018-07-02 | 1.2      | 1.7     | 2.9
2018-07-03 | 1.7      | 2.1     | 3.8
2018-07-05 | 2.1      | 3       | 5.1
2018-07-06 | 3        | 3.5     | 6.5

希望你能帮助我!

最佳答案

解决方法是先在子查询中运行GROUP BY语句,然后才运行变量计算:

选择日期时间, @previous AS 以前, @previous + MaxVal 加入, @previous := MaxVal AS 当前 从 ( 选择 `dateTime`, MAX(`value`) AS MaxVal 从`表` 在'2018-07-01'和'2018-07-30'之间的'dateTime' 按“日期时间”分组 ) 组 按“日期时间”排序

关于MySQL - 如何在 select 语句中设置变量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51256961/

相关文章:

java - 从其他表获取数据的错误sql语法

mysql - 查询以获得彼此在 2% 以内的前值和后值?

mysql - 如何创建非强制加入?

PHPExcel 和文本换行

php - 具有多个条件的MySQL预订系统

Java 与 MySql 数据库的连接问题

MySQL now() 仅使用日期计算日期时间值

mysql - 识别 2 个表中的不同行

php - 获取过去7天的点击总和

mysql - 更新OPENQUERY失败