簡體   English   中英

如何將時間列分為5分鍾間隔和最大/最小值分別為SQL?

[英]How to group time column into 5 minute intervals and max/min value respectively SQL?

我有一個數據庫,其日期時間列包含+/- 30秒的間隔和一個包含10到100之間隨機數的列。我的表如下所示:

datetime               value
----------------------------
2016-05-04 20:47:20    12
2016-05-04 20:47:40    44
2016-05-04 20:48:30    56
2016-05-04 20:48:40    25
2016-05-04 20:49:30    92
2016-05-04 20:49:40    61
2016-05-04 20:50:00    79
2016-05-04 20:51:20    76
2016-05-04 20:51:30    10
2016-05-04 20:51:40    47
2016-05-04 20:52:40    23
2016-05-04 20:54:00    40
2016-05-04 20:54:10    18
2016-05-04 20:54:50    12
2016-05-04 20:56:00    55

我想要以下輸出:

datetime               max_val    min_val
-----------------------------------------
2016-05-04 20:45:00    92         12
2016-05-04 20:50:00    79         10
2016-05-04 20:55:00    55         55

之前,我甚至可以繼續獲得最大值和最小值,我首先要 datetime列分成5個分鍾的間隔。 根據我的研究,我想出了這個:

SELECT
  time,
  value
FROM random_number_minute
GROUP BY
  UNIX_TIMESTAMP(time) DIV 300

這實際上 datetime列到5個分鍾為間隔是這樣的:

datetime
-------------------
2016-05-04 20:47:20
2016-05-04 20:50:00
2016-05-04 20:56:00

這非常接近,因為它需要下一個最接近的日期時間到,在這種情況下, 20:45:0020:50:00 ,等我想ROUNDDOWN 日期時間到最近的5分鍾后無論的,例如如果分鍾是:

minutes    rounddown
--------------------
10         10
11         10
12         10
13         10
14         10
15         15
16         15
17         15
18         15
19         15
20         20

時間可能是14:59 ,我想向下舍入10:00 經過幾個小時的研究,我也試過用這個:

SELECT
    time,
    time_rounded =
    dateadd(mi,(datepart(mi,dateadd(mi,1,time))/5)*5,dateadd(hh,datediff(hh,0,dateadd(mi,1,time)),0))

但遺憾的是,這沒有用。 我收到此錯誤:

調用本機函數'datediff'時參數計數不正確

我也試過這個:

SELECT  
    time, CASE  
          WHEN  DATEDIFF(second, DATEADD(second, DATEDIFF(second, 0, time_out) / 300 * 300, 0), time) >= 240
            THEN    DATEADD(second, (DATEDIFF(second, 0, time) / 300 * 300) + 300, 0)
            ELSE    DATEADD(second, DATEDIFF(second, 0, time) / 300 * 300, 0)
          END

返回相同的錯誤。

我怎樣才能做到這一點? 在對日期時間進行分組后,如何獲取數據分組的最大值和最小值?

在GROUP BY中使用各種日期分區功能。

碼:

SELECT from_unixtime(300 * round(unix_timestamp(r.datetime)/300)) AS 5datetime,
MAX(r.value) AS max_value, 
MIN(r.value) As min_value,
(SELECT r.value FROM random_number_minute ra WHERE ra.datetime = r.datetime order by ra.datetime desc LIMIT 1) as first_val
FROM random_number_minute r
GROUP BY UNIX_TIMESTAMP(r.datetime) DIV 300

輸出:

5datetime               max_value   min_value   first_val
May, 04 2016 20:45:00   92          12          12
May, 04 2016 20:50:00   79          10          79
May, 04 2016 20:55:00   55          55          55

SQL小提琴: http ://sqlfiddle.com/#!9 / e16b1 / 17/0

對不起,如果我重復另一個答案。 如果我是,我會刪除..

SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(datetime)/300)*300) x
     , MIN(value) min_value
     , MAX(value) max_value 
  FROM my_table 
 GROUP 
    BY x;
SELECT 
    timestamp(concat(date(time), ' ', hour(time), ':', minute(time) div 5 * 5)) as floor_time,
    min(value),
    max(value)
FROM random_number_minute
GROUP BY date(time), hour(time), minute(time) div 5 * 5

http://sqlfiddle.com/#!9/91212f/5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM