MySQL查询中的增量?

时间:2015-10-02 00:21:51

标签: mysql

我的数据如下:

id        start_time               sub_id   
 6    2015-01-03 19:00:00             3    
 5    2015-01-03 18:00:00             3         
 4    2015-01-03 17:00:00             3    
 3    2015-01-02 15:08:00             2   
 2    2015-01-01 14:08:00             2    
 1    2015-01-01 22:00:00             1   

我想使用查询来转换数据,如下所示:

id        start_time               sub_id   stage 
 6    2015-01-03 19:00:00             3       3
 5    2015-01-03 18:00:00             3       2 
 4    2015-01-03 17:00:00             3       1
 3    2015-01-02 15:08:00             2       2
 2    2015-01-01 14:08:00             2       1
 1    2015-01-01 22:00:00             1       1

无法更改表本身,只需查询它。

我正在尝试创建一个额外的列" stage"在我的查询结果中,它计算表中sub_id的外观,从每个新的sub_id开始。

我已经看到了一些使用游标或其他方法的建议,但这些是计算整个表的行数,而不是在行的值从之前的行更改时重新开始计数。 / p>

我应该怎么做呢?它是否可以在原生MySQL中使用?

2 个答案:

答案 0 :(得分:1)

您可以使用变量执行此操作:

select d.*,
       (@rn := if(@s = sub_id, @rn + 1,
                  if(@s := sub_id, 1, 1)
                 )
       ) as stage
from data d cross join
     (select @s := 0, @rn := 0) params
order by sub_id, id desc;

分配变量并仅在单个表达式中使用它们非常重要,这就是此版本具有嵌套if()的原因。 MySQL文档非常清楚,您应该避免在一个表达式中分配变量并在另一个表达式中使用它。

答案 1 :(得分:0)

SQL Fiddle Demo

SET @row_number:=0; 
SET @sub_id:= 0; 

SELECT id, 
       start_time, 
       CASE 
         WHEN @sub_id = sub_id THEN @row_number := @row_number + 1 
         ELSE @row_number := 1 
       end AS ROWNO, 
       CASE 
         WHEN @sub_id <> sub_id THEN @sub_id := sub_id 
         ELSE @sub_id 
       end 
FROM   dates 
ORDER  BY sub_id DESC, 
          rowno DESC