Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 分组表达式可以与变量赋值一起使用吗?_Mysql_Sql - Fatal编程技术网

Mysql 分组表达式可以与变量赋值一起使用吗?

Mysql 分组表达式可以与变量赋值一起使用吗?,mysql,sql,Mysql,Sql,我试图计算分组结果集中的行差异(如): create table test (i int not null auto_increment, a int, b int, primary key (i)); insert into test (a,b) value (1,1),(1,2),(2,4),(2,8); 给予 这是带有组和max(组)result列的简单SQL: select data.a, max(data.b) from ( select a

我试图计算分组结果集中的行差异(如):

create table test (i int not null auto_increment, a int, b int, primary key (i));
insert into test (a,b) value (1,1),(1,2),(2,4),(2,8);
给予

这是带有组和
max(组)
result列的简单SQL:

select 
    data.a,
    max(data.b)
from
    (
        select a, b
        from test
        order by i
    ) as data
group by a
order by a
显而易见的结果是

| a | max(data.b)
-----------------
| 1 | 2
| 2 | 8
当我想计算分组列上的逐行差异时,我失败了:

set @c:=0;
select 
    data.a,
    max(data.b),
    @c:=max(data.b)-@c
from
    (
        select a, b
        from test
        order by i
    ) as data
group by a
order by a
仍然给出:

| a | max(data.b) | @c:=max(data.b)-@c
--------------------------------------
| 1 | 2           | 2 (expected 2-0=2)
| 2 | 8           | 8 (expected 8-2=6)
有人能强调一下@c变量没有按预期从分组行更新到分组行的原因吗

SELECT data.a
     , data.b
     , @c := data.b - @c
FROM (
        SELECT a
             , max(b) AS b
        FROM test
        GROUP BY a
     ) AS data
ORDER BY a

记录的解决方案可能如下所示

SELECT x.* 
     , @c := b - @c c
  FROM test x 
  JOIN 
     ( SELECT a,MAX(b) max_b FROM test GROUP BY a ) y 
    ON y.a = x.a 
   AND y.max_b = x.b
  JOIN (SELECT @c:= 0) vals;

您的第一个查询不是“明显的”。事实上,这是错误的,或者更准确地说,结果无法保证(根据MySQL的文档)@草莓:你能指一下相关的文件吗?我不知道为什么这不起作用。我读过9.4用户定义变量,但这似乎不适用于这里(在HAVE、GROUP BY或ORDER BY子句中访问变量)@andig:将变量分配给聚合函数结果时存在问题(此分配被忽略)。尽管你的解决方案很好,但我仍然无法准确理解实际问题是什么。即使设置SET GLOBAL sql_mode='ONLY_FULL_GROUP_BY',我的语句仍然会根据问题的注释执行它们不应该执行的语句?
SELECT x.* 
     , @c := b - @c c
  FROM test x 
  JOIN 
     ( SELECT a,MAX(b) max_b FROM test GROUP BY a ) y 
    ON y.a = x.a 
   AND y.max_b = x.b
  JOIN (SELECT @c:= 0) vals;