2012-11-20 72 views
1

我有一個包含2列,日期和金額的表格。我希望能夠在數量上找到x天峯值。所以如果我有下面的表格並且正在尋找說出3天的峯值,那麼當天的意義數量高於任何一天的前3天或之後的日期,那麼該日期將被選擇。如何從日期和金額列表中選擇最高金額日期

date   amount 
2012-09-04 | 53137.47 
2012-09-05 | 53137.2 
2012-09-06 | 53137.54 
2012-09-07 | 53138.58 
2012-09-10 | 53138.73 
2012-09-11 | 53138.28 
2012-09-12 | 53138.22 
2012-09-13 | 53138.48 
2012-09-14 | 53140.14 
2012-09-17 | 53139.82 
2012-09-18 | 53139.86 
2012-09-19 | 53140.01 
2012-09-20 | 53139.75 
2012-09-21 | 53139.82 
2012-09-24 | 53139.01 
2012-09-25 | 53138.93 
2012-09-26 | 53138.48 
2012-09-27 | 53138.83 
2012-09-28 | 53138.62 

應該選擇2012年9月10日,2012年9月14日

我已經嘗試使用聯接和派生表,但我似乎無法得到它的工作。

嘗試了以下內容:

select * from a WHERE 
amount=(select MAX(amount) from a where 
date<date_add(date,interval 3 day) and 
date>date_sub(date,interval 3 day)); 

SELECT a1.* 
    FROM a AS a1 
    JOIN a AS a2 ON 
(select * from a1 where 
a2.DATE < a1.DATE + 3 and 
a2.DATE > a1.DATE - 3) myalias 
    WHERE a1.amount > a2.amount; 
+0

最大值是在+/- 3個日曆日的時間間隔內(如您的查詢嘗試所示)或表中連續日期的+/- 3個間隔中計算的最大值(如不包括2012-09 -19從你想要的結果)? –

+0

我打算根據表格中的連續日期進行計算,我現在看到我沒有這樣做。 –

回答

0

爲了找到最大的日期間隔,你必須加入紀錄爲中心日期記錄爲其他在間隔中的日期,然後按中心日期分組。

嘗試此查詢:

SELECT a1.date, a1.amount, max(a2.amount) AS highest 
FROM tbl a1 LEFT JOIN tbl a2 
ON a2.date BETWEEN date_sub(a1.date, interval 3 DAY) 
      AND date_add(a1.date, interval 3 DAY) 
GROUP BY a1.date, a1.amount 
HAVING a1.amount = highest 
ORDER BY a1.date; 

要獲得基於連續的記錄,而不是日曆天一個答案,你將不得不augument與行號表(通過做自聯接表的本身) ,然後做一個自我這個擴展表加入到本身比較數額時,在+/- 3行,每行日期的選擇行:

SELECT t3.date FROM 
    (SELECT t1.date AS date, t1.amount AS amount, count(t2.date) AS rownum 
    FROM tbl t1 
    INNER JOIN tbl t2 
    ON t2.date <= t1.date 
    GROUP BY t1.date, t1.amount) AS t3 
LEFT JOIN 
    (SELECT t1.date AS date, t1.amount AS amount, count(t2.date) AS rownum 
    FROM tbl t1 
    INNER JOIN tbl t2 
    ON t2.date <= t1.date 
    GROUP BY t1.date, t1.amount) AS t4 
ON t3.rownum <> t4.rownum 
AND t3.rownum - t4.rownum BETWEEN -3 AND 3 
AND t4.amount >= t3.amount 
WHERE t4.date IS NULL 
ORDER BY t3.date 

這個工作在兩個MySQL和PostgreSQL,並應在其他工作數據庫引擎也是如此。 在除MySQL之外的其他數據庫中,可以通過對兩個子查詢使用CTE來簡化它。

對此SQLfiddle進行測試。

+0

太棒了!這適用於日曆日。如上所述,我需要嘗試調整表格中的連續日期。謝謝! –

+0

糟糕。我要求澄清,然後我誤解了答案。 –

+0

再次感謝。正如你所說,我正在使用MySQL,所以我需要找到一種不同的方式。當我嘗試你的例子時,我在MySQL中出現以下錯誤:錯誤1235(42000):此版本的MySQL尚不支持'LIMIT&IN/ALL/ANY/SOME子查詢' –