2016-02-04 22 views
2

我想统计使用MySQL分组的ID列值的变化数量。MySQL的计数变化

源表:

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做到这一点。

+0

是一些目标。很多方法。您可以使用窗口函数,特别是滞后。窗口函数并不适用于所有SQL风格,因此快速和肮脏的方法是添加一个行号,然后通过a.rownumber = b.rownumber + 1将内部表加入到表中(按日期,id排序)。搜索延迟/行号结束,你会发现很多好消息 –

+0

不应该是2-1而不是2-0? –

+1

http://www.mysqltutorial.org/mysql-row_number/显示了2种模拟MySQL中行数的方法。 MS有它内置 –

回答

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:[email protected]+1, @i:[email protected]))) as changes, 
    @lastV := `value`, 
    @lastId := `id` 

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