Я взял ваши образцы данных и бросил их в простую таблицу:
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 года).
Не уверен, поможет ли это вам вообще ...