iT邦幫忙

0

詢求如何在mysql中捉取一天當中每五分鐘最大值最小值列出

請問
mysql如何捉取某一天每五分鐘數據的最大值最小值逐筆列出

例:
日期 值
2019-12-13 14:01 10
2019-12-13 14:02 11
2019-12-13 14:03 12
2019-12-13 14:04 13
2019-12-13 14:05 14
2019-12-13 14:06 12
2019-12-13 14:07 14
2019-12-13 14:08 14
2019-12-13 14:09 14
2019-12-13 14:10 20

例如:
最大值 最小值
2019-12-13 14:05 14 2019-12-13 14:01 10
2019-12-13 14:10 20 2019-12-13 14:06 12

14:05 是取 14:05:00~14:05:59

看更多先前的討論...收起先前的討論...
slime iT邦大師 1 級 ‧ 2019-12-13 16:29:39 檢舉
14:05 是取 14:05:00~14:09:59 還是 14:01:00~14:05:59 ?
14:05 是取 14:05:00~14:05:59
舜~ iT邦好手 1 級 ‧ 2019-12-13 17:03:54 檢舉
只取每五分鐘數據內的最大值與最小值??
是的
有嘗試使用
SELECT UpdateDate,MAX(price),MIN(price) FROM `date` where DATE_FORMAT(UpdateDate,'%i')%5 = 0 AND `DateTime` = '2019-09-26' group by UpdateDate

但結果有點怪怪
不是 這樣列表??
14:00~14:04 最大值與最小值
14:05~14:09
14:10~14:14
14:15~14:19

1 個回答

3
浩瀚星空
iT邦大師 1 級 ‧ 2019-12-13 17:53:47
最佳解答

其實,給你一個想法。這東西我以前就做過。有點懶的寫。就告訴你觀念好了。

將你的實際日期先轉成unixtime。

1.然後再將其數值round(unixtime/300)。
這樣你就可以得到每5分的同樣key值了。

2.依上面的資料做為子查尋後。再依新生成的值當key來做group。就可以得到每5分的最大最小值了。

我懶的寫,有寫要幫我補的拿去用。原理就只是這樣。

ps:如果要微調算00~59。可以在生成的unixtime-1。就行了

看更多先前的回應...收起先前的回應...

有嘗試使用
SELECT UpdateDate,MAX(price),MIN(price) FROM date where DATE_FORMAT(UpdateDate,'%i')%5 = 0 AND DateTime = '2019-09-26' group by UpdateDate

但跑出來的結果
https://ithelp.ithome.com.tw/upload/images/20191213/20119327gi70LB0MiK.png

你要做成子查尋分開處理
而且你取餘數也不對吧。

算了,你等我一下。我寫一份給你

來吧

SELECT 
FROM_UNIXTIME(unixtime*300,'%Y-%m-%d %H:%i:%s') AS stime,
FROM_UNIXTIME(unixtime*300+299,'%Y-%m-%d %H:%i:%s') AS etime,
max(price),
min(price) FROM
(
   SELECT floor(UNIX_TIMESTAMP(UpdateDate)/300) AS unixtime,price FROM `date`
) AS d GROUP BY unixtime

原理因該不用我解釋吧。反正就是將每5分內的資料,統統化成同一個key就行了。所以採用了unixtime的特性。直接除於5分(300)的值。
產生的整數值就是固定的key了。

將其做為子查尋。再交由另外一個處理還原回來基本值再依其對應key來取最大最小值。

就解決了。

寫成這樣還不懂原理的話。我就沒辦法了。

喔喔
看懂了,感謝你~~

請問如果要這裡面加上取出資料第一筆和最後一筆要如何操作?

依時間排序的第一筆跟最後一筆嘛??

五分鐘內的第一筆跟最後一筆

SELECT unixtime,SUBSTRING_INDEX(moneys,',',1) AS mtop,SUBSTRING_INDEX(moneys,',',-1) AS mfoot FROM (
  SELECT unixtime,GROUP_CONCAT(money ORDER BY created_at) AS moneys FROM (
    SELECT *,floor(UNIX_TIMESTAMP(created_at)/300) AS unixtime FROM pay_orders  
  ) AS tt GROUP BY unixtime
) AS dd

原理說明,由於沒有直接能取第一筆及最後一筆的函數。
所以我是採用了GROUP_CONCAT的特性後。再將其第一跟最後分離出來。

我就告訴你這樣了。其它自已去組合吧。我就不幫你組合了。
告訴你這些已經違背我的意思了。

我要發表回答

立即登入回答