+------------+------+
| 2011-03-04 | 6 |
| 2011-03-01 | 1 |
| 2011-02-28 | 4 |
| 2011-02-24 | 1 |
| 2011-02-23 | 1 |
| 2011-02-22 | 2 |
| 2011-02-17 | 1 |
| 2011-02-16 | 22 |
| 2011-02-12 | 2033 |
| 2011-02-10 | 1 |
| 2011-02-07 | 1 |
| 2011-01-04 | 1 |
| 2011-01-03 | 5 |
| 2010-12-26 | 6 |
| 2010-12-16 | 1 |
| 2010-12-15 | 158 |
| 2010-12-14 | 1703 |
| 2010-12-13 | 199 |
| 2010-11-08 | 1 |
| 2010-10-28 | 3 |
| 2010-10-27 | 6 |
| 2010-10-25 | 1 |
| 2010-10-21 | 660 |
| 2010-10-20 | 558 |
| 2010-10-19 | 245 |
| 2010-10-18 | 579 |
| 2010-10-15 | 14 |
| 2010-10-14 | 1 |
| 2010-10-04 | 1 |
| 2010-09-08 | 1 |
| 2010-09-01 | 1 |
| 2010-08-31 | 1 |
| 2010-08-30 | 6 |
| 2010-08-26 | 1 |
| 2010-08-24 | 4 |
| 2010-08-23 | 2 |
| 2010-08-19 | 3 |
| 2010-08-18 | 144 |
| 2010-08-17 | 920 |
| 2010-08-16 | 982 |
| 2010-08-03 | 1 |
| 2010-08-02 | 1 |
| 2010-07-12 | 1 |
| 2010-06-30 | 8 |
| 2010-06-29 | 1 |
| 2010-06-28 | 1 |
| 2010-06-23 | 1 |
| 2010-06-22 | 1 |
| 2010-06-17 | 7 |
| 2010-06-16 | 703 |
| 2010-06-15 | 937 |
| 2010-06-14 | 397 |
| 2010-06-10 | 2 |
| 2010-06-09 | 1 |
| 2010-06-01 | 5 |
| 2010-05-26 | 1 |
| 2010-05-05 | 1 |
| 2010-04-27 | 2 |
| 2010-04-26 | 4 |
| 2010-04-24 | 6 |
| 2010-04-22 | 2 |
| 2010-04-21 | 351 |
| 2010-04-20 | 839 |
| 2010-04-19 | 850 |
| 2010-04-18 | 2 |
| 2010-04-15 | 2 |
| 2010-04-07 | 1 |
| 2010-04-01 | 2 |
| 2010-03-30 | 1 |
| 2010-03-22 | 1 |
| 2010-03-10 | 1 |
| 2010-03-08 | 1 |
| 2010-03-04 | 1 |
| 2010-03-01 | 3 |
| 2010-02-27 | 6 |
| 2010-02-25 | 2 |
| 2010-02-23 | 4 |
| 2010-02-22 | 1 |
| 2010-02-18 | 188 |
| 2010-02-17 | 1210 |
| 2010-02-16 | 646 |
| 2010-01-27 | 1 |
| 2010-01-21 | 1 |
| 2010-01-07 | 1 |
| 2010-01-06 | 2 |
| 2010-01-04 | 12 |
+------------+------+
我有过去几年的数据集。我想将类似的阅读日期归为一类。就像取范围 2011-02-07 和 2011-03-04 并将它们组合在一起作为当年的读数:1。
或者将 2010-10-04 和 2010-10-28 合并为阅读编号:当年的第 5 号。
基于第二列的读数计数进行的分组类似。有些尖峰需要分组在一起。每年有6个周期,周期之间至少相差40天。
如何在 MySQL 中做到这一点?
最佳答案
我将您的示例数据放入一个简单的表格中:
CREATE TABLE `usage_bill` (
`readdate` date default NULL,
`reading` int(11) default NULL
);
我已经能够以如下通用方式检测峰值:
SET @seq1 := 0;
SET @seq2 := 0;
SET @lastdiff := 0;
SELECT readdate, reading FROM (
SELECT ref2.readdate, ref1.reading, ref2.reading - ref1.reading AS diff,
(@lastdiff>0) && (ref2.reading - ref1.reading)<0 AS peak,
@lastdiff := ref2.reading - ref1.reading AS lastdiff FROM
(SELECT @seq1 := @seq1 + 1 AS rowNum, readdate, reading FROM usage_bill ORDER BY readdate) AS ref1,
(SELECT @seq2 := @seq2 + 1 AS rowNum, readdate, reading FROM usage_bill ORDER BY readdate) AS ref2
WHERE ref1.rowNum+1 = ref2.rowNum ) AS peaks
WHERE peak=1;
理论上,应该可以仅添加 ORDER BY Reading DESC LIMIT 6
来获得最大峰值,但实际上并非如此,因为并非所有峰值都是干净的曲线(例如 2010 年 10 月)。
不确定这是否对您有帮助......
关于mysql - 将多个阅读日期分组为簇,该年的第 N 次阅读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5937736/