MySQL数量变化

时间:2016-02-04 19:31:20

标签: mysql sql count aggregate-functions

我想计算使用MySQL按ID分组的列值的更改次数。

来源表:

create table sequence
(
   `Id` int,
   `Date` date,
   `Value` int not null,
   PRIMARY KEY (`Id`,`Date`)
);

insert into sequence
    ( `Id`,`Date`, `Value` )
  values
    (1, '2016-01-01' , 0  ),
    (1, '2016-01-02' , 10 ),
    (1, '2016-01-03' , 0  ),
    (1, '2016-01-05' , 0  ),
    (1, '2016-01-06' , 10 ),
    (1, '2016-01-07' , 15 ),
    (2, '2016-01-08' , 15 );

可视化:

+------------+-------+-------+ 
| Date       |  ID   | Value |
+------------+-------+-------+
| 2016-01-01 |   1   |   0   |  
| 2016-01-02 |   1   |   10  | (change)
| 2016-01-03 |   1   |   0   | (change)
| 2016-01-05 |   1   |   0   |
| 2016-01-06 |   1   |   10  | (change)
| 2016-01-07 |   1   |   15  | (change)
| 2016-01-08 |   2   |   15  |
+------------+-------+-------+

预期产出:

+-------+-------+ 
|  ID   | Value |
+-------+-------+
|   1   |   4   |  
|   2   |   0   | 
+-------+-------+   

我想问一下在SQL中是否有办法解决这个问题。

1 个答案:

答案 0 :(得分:0)

这不是非常有效或优雅的解决方案, 但只是为了展示一些你可以用mysql实现的目标: - )

http://sqlfiddle.com/#!9/1db14/6

SELECT t1.id, MAX(t1.changes)
FROM (SELECT t.*, 
   IF (@i IS NULL,@i:=0,IF(@lastId <> id,@i:=0,IF (@lastV <> `value`, @i:=@i+1, @i:=@i))) as changes,
   @lastV := `value`,
   @lastId := `id`

FROM (
  SELECT *
  FROM sequence
  ORDER BY id, date) t
) t1
GROUP BY t1.id