【问题标题】:MySQL count changesMySQL 计数更改
【发布时间】:2016-05-14 14:10:46
【问题描述】:

我想使用 MySQL 计算按 Id 分组的列 Value 中的更改次数。

源表:

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

【问题讨论】:

  • 是的。很多种方法。您可以使用窗口函数,尤其是 Lag。并非所有 SQL 风格都提供窗口函数,因此一种快速而肮脏的方法是添加一个行号,然后使用 a.rownumber=b.rownumber+1 将表(按日期、id 排序)内部连接到自身。搜索 Lag/row number over,你会发现很多好的来源
  • 不应该是2-1而不是2-0吗?
  • mysqltutorial.org/mysql-row_number 展示了在 MySQL 中模拟行号的两种方法。 MS内置了它

标签: mysql sql count aggregate-functions


【解决方案1】:

这不是非常有效或优雅的解决方案, 但只是为了展示一些您可以使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2011-12-30
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多