MySQL: 如何统计偏差数?
MySQL: How to count the number of deviations?
我有一个包含两列的 table:时间戳和整数值(我们将它们命名为 date
和 value
)。第二个值在 0 和 ~290 之间波动,然后回到 0,所以在图表上它看起来像一个波浪(详情查看 on screenshot).
如何将集合中这些掉落的数量计数为 0?
预期结果是从高点到零的下降次数(如图所示)。 MySQL 版本为 5.5.37-0+wheezy1.
数据样本:
data value
2017-10-10 00:00:00 270
2017-10-10 00:00:01 270
2017-10-10 00:00:02 270
2017-10-10 00:00:03 265
2017-10-10 00:00:04 263
2017-10-10 00:00:05 184
2017-10-10 00:00:06 87
2017-10-10 00:00:07 23
2017-10-10 00:00:08 0
2017-10-10 00:00:09 0
2017-10-10 00:00:10 0
2017-10-10 00:00:11 0
2017-10-10 00:00:12 24
2017-10-10 00:00:13 87
2017-10-10 00:00:14 189
2017-10-10 00:00:15 241
2017-10-10 00:00:16 267
2017-10-10 00:00:17 267
2017-10-10 00:00:18 265
2017-10-10 00:00:19 266
你说 "rows" 的地方是要说 "columns" 吗?假设是这样,您可能想要编辑您的问题。
至于问题本身:
假设您在一行中有多个零并且想要只计算前面有更高值的零,您可能可以调整这个关于如何检测先前值的现有答案在 MySQL.
很抱歉只提供 link 作为答案 -- 这将是一条评论,但我还没有发表评论的资格。
查看此工作
MySQL 5.6 架构设置:
CREATE TABLE Table1
(`ts` datetime, `value` int)
;
INSERT INTO Table1
(`ts`, `value`)
VALUES
('2017-01-01 00:00:00', 270),
('2017-01-01 00:00:00', 270),
('2017-01-01 00:00:00', 270),
('2017-01-01 00:00:00', 0),
('2017-01-01 00:00:00', 270),
('2017-01-01 00:00:00', 270),
('2017-01-01 00:00:00', 0)
;
查询 1:
select count(*) as count_drops
from (
select
@prev as previous
, t1.ts
, @prev := t1.value as current
from table1 t1
cross join (select @prev := null x) var
) as d
where current = 0 and previous > 0
| count_drops |
|-------------|
| 2 |
我有一个包含两列的 table:时间戳和整数值(我们将它们命名为 date
和 value
)。第二个值在 0 和 ~290 之间波动,然后回到 0,所以在图表上它看起来像一个波浪(详情查看 on screenshot).
如何将集合中这些掉落的数量计数为 0?
预期结果是从高点到零的下降次数(如图所示)。 MySQL 版本为 5.5.37-0+wheezy1.
数据样本:
data value
2017-10-10 00:00:00 270
2017-10-10 00:00:01 270
2017-10-10 00:00:02 270
2017-10-10 00:00:03 265
2017-10-10 00:00:04 263
2017-10-10 00:00:05 184
2017-10-10 00:00:06 87
2017-10-10 00:00:07 23
2017-10-10 00:00:08 0
2017-10-10 00:00:09 0
2017-10-10 00:00:10 0
2017-10-10 00:00:11 0
2017-10-10 00:00:12 24
2017-10-10 00:00:13 87
2017-10-10 00:00:14 189
2017-10-10 00:00:15 241
2017-10-10 00:00:16 267
2017-10-10 00:00:17 267
2017-10-10 00:00:18 265
2017-10-10 00:00:19 266
你说 "rows" 的地方是要说 "columns" 吗?假设是这样,您可能想要编辑您的问题。
至于问题本身:
假设您在一行中有多个零并且想要只计算前面有更高值的零,您可能可以调整这个关于如何检测先前值的现有答案在 MySQL.
很抱歉只提供 link 作为答案 -- 这将是一条评论,但我还没有发表评论的资格。
MySQL 5.6 架构设置:
CREATE TABLE Table1
(`ts` datetime, `value` int)
;
INSERT INTO Table1
(`ts`, `value`)
VALUES
('2017-01-01 00:00:00', 270),
('2017-01-01 00:00:00', 270),
('2017-01-01 00:00:00', 270),
('2017-01-01 00:00:00', 0),
('2017-01-01 00:00:00', 270),
('2017-01-01 00:00:00', 270),
('2017-01-01 00:00:00', 0)
;
查询 1:
select count(*) as count_drops
from (
select
@prev as previous
, t1.ts
, @prev := t1.value as current
from table1 t1
cross join (select @prev := null x) var
) as d
where current = 0 and previous > 0
| count_drops |
|-------------|
| 2 |