首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分组表达式可以与变量赋值一起使用吗?

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

Stack Overflow用户
提问于 2014-06-09 00:45:57
回答 2查看 48关注 0票数 1

我正在尝试计算分组结果集上的行差(如MySQL difference between two rows of a SELECT Statement):

代码语言:javascript
复制
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);

给出

代码语言:javascript
复制
| a | b
---------
| 1 | 1
| 1 | 2
| 2 | 4
| 2 | 8

下面是包含group和max(group)结果列的简单SQL:

代码语言:javascript
复制
select 
    data.a,
    max(data.b)
from
    (
        select a, b
        from test
        order by i
    ) as data
group by a
order by a

显而易见的结果是

代码语言:javascript
复制
| a | max(data.b)
-----------------
| 1 | 2
| 2 | 8

我失败的地方是当我想要计算分组列上的逐行差异时:

代码语言:javascript
复制
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

仍然提供了:

代码语言:javascript
复制
| a | max(data.b) | @c:=max(data.b)-@c
--------------------------------------
| 1 | 2           | 2 (expected 2-0=2)
| 2 | 8           | 8 (expected 8-2=6)

有人能强调一下为什么@c变量没有按预期从一个分组行更新到另一个分组行吗?

EN

回答 2

Stack Overflow用户

发布于 2014-06-09 00:50:43

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-06-09 01:52:25

“文档化”的解决方案可能如下所示……

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24108413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档