【发布时间】: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