web-dev-qa-db-ja.com

mysqlクエリを15分間隔でグループ化します

N秒ごとにデータを収集する監視システムがあります(nは約10ですが、変化します)。収集したデータを15分間隔で集計したいと思います。タイムスタンプ値を15分のチャンクに統合して、グループ化を機能させる方法はありますか?

31
gsiener
SELECT   FLOOR(UNIX_TIMESTAMP(timestamp)/(15 * 60)) AS timekey
FROM     table
GROUP BY timekey;
53
unutbu

これを試して、15分間隔のレコードをグループ化し、15 * 60を必要な秒単位の間隔に変更できます

SELECT sec_to_time(time_to_sec(datefield)- time_to_sec(datefield)%(15*60)) as intervals from tablename
group by intervals
12
BenG

以下のアプローチ1)の適応:

select Round(date_format(date, "%i") / (15*60)) AS interval  
from table
group by interval 

以下のアプローチ3)の適応:

SELECT Round(Convert(substring(date_column, 14, 2), UNSIGNED) / (15*60)) AS interval /* e.g. 2009-01-04 12:20:00 */
FROM table 
GROUP BY interval;

私が見つけたいくつかのアプローチ ここ

1)

select date_format(date, "%W") AS `Day of the week`, sum(cost)
from daily_cost
group by `Day of the week` 
order by date_format(date, "%w")

2)

select count(*) as 'count', 
  date_format(min(added_on), '%Y-%M-%d') as 'week commencing',
  date_format(added_on, '%Y%u') as 'week' 
from system 
where added_on >= '2007-05-16' 
group by week 
order by 3 desc;

3)

SELECT substring(postdate, 1,10) AS dd, COUNT(id) FROM MyTable GROUP BY dd;

(ここも: http://www.bradino.com/mysql/dayparting-on-datetime-field-using-substring/

編集:すべてのソリューションは、多数のレコードを持つテーブルではパフォーマンスが低下します。

4
Martin Vseticka

上記のunutbuの回答から始めましたが、必要なものが得られず、少し追加する必要がありました。

Select Created, from_unixtime(FLOOR(UNIX_TIMESTAMP(Created)/(15*60))*(15*60)) GroupTime, COUNT(*) as Cnt FROM issue i GROUP BY GroupTime

このコードは、15分間で900秒で除算し、値をフロアし、900で乗算し直します。基本的に、最も近い15分の増分に切り捨てます。

4
James

次のクエリは行をグループ化し、15分間隔でタイムスタンプを作成します。

_Select concat( date(created_dt) , ' ', sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))as created_dt_new from table_name group by created_dt_new 
_


E.gタイムスタンプ
2016-11-09 13:16:29
2016-11-09 13:16:49
2016-11-09 13:17:06
2016-11-09 13:17:26
2016-11-09 13:18:24
2016-11-09 13:19:59
2016-11-09 13:21:17

2016-11-09 13:30:00にグループ化されます

  1. sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))
    時間の上限は15分間隔です。例:12:10-> 12:15

  2. concat( date(created_dt) , ' ', sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))
    タイムスタンプフィールドから日付を取得してタイムスタンプを生成します。

3
Vineeta Khatuja

Unixタイムスタンプ:次のいずれかを使用して、15分単位でそれらをフロアリングします。

timestamp div (15 * 60) * (15 * 60) -- div is integer division operator
timestamp - timestamp % (15 * 60)

日付時刻:データ型に秒の小数部がないと仮定すると、次を使用して15分単位で最も近い値になります:

date - INTERVAL EXTRACT(SECOND FROM date) SECOND - INTERVAL EXTRACT(MINUTE FROM date) % 15 MINUTE

DBFiddle

2
Salman A

これは私のために働く

SELECT CONCAT (
        YEAR(transactionDate)
        ,'-'
        ,MONTH(transactionDate)
        ,'-'
        ,DAYOFMONTH(transactionDate)
        ,' '
        ,HOUR(transactionDate)
        ,':'
        ,((floor((MINUTE(transactionDate) / 15)) + 1) * 15) - 1
        ,':59'
        ) AS tmp1
    ,count(*)
FROM tablename
GROUP BY tmp1 limit 20;
0

「15」を任意の間隔に変更します。

select count(*),
CONCAT(HOUR(col_date),":",(MINUTE(create_date) div 15)*15) as date
from tablename
GROUP BY date
ORDER BY col_date ASC;
0
Robert Chan

これは私のために働いた

mysql> **SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())- UNIX_TIMESTAMP(NOW())%(15*60));**
+---------------------------------------------------------------------+
| FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())- UNIX_TIMESTAMP(NOW())%(15*60)) |
+---------------------------------------------------------------------+
| 2012-02-09 11:15:00                                                 |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)
0
Vitaly Nikolaev