mysql - 将多个阅读日期分组为簇,该年的第 N 次阅读

标签 mysql sql stored-procedures

+------------+------+
| 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/

相关文章:

mysql - 如何检查 ruby​​ on rails 中的 mysql 连接

mysql - Active Record Join 语句优化

php - SQL LEFT JOIN & AND 关键字

sql-server - 上次执行存储过程的时间

javascript - 使用两个选择控件编辑表单,以便在首次启动时进行过滤

mysql - 删除表中 TimeStamp 最小的地方

python - 如何将 csv 上传到 s3 存储桶中的我的文件夹中?

SQL:根据正则表达式选择不同的

sql - Sybase 将问题从 float 转换为 varchar

mysql - 当 CASE 不存在时,SQL 计数返回 0