亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

每 15 分鐘的 MySQL 組紀元時間戳

每 15 分鐘的 MySQL 組紀元時間戳

PHP
慕娘9325324 2023-06-18 16:34:23
我有一個數據庫,它以相當高的頻率收集一些數據并記錄每個條目的時間戳(存儲為紀元時間,而不是 mysql 日期時間)。例如timestamp               rssi    sender-------------------------------------------1592353967.171600       -67     9EDA3DBFFE151592353967.228000       -67     9EDA3DBFFE151592353967.282900       -62     E2ED2569BE21592353971.892600       -67     9EDA3DBFFE151592353973.962900       -61     2ADE2E4597B2...我的目標是能夠在 15 分鐘的時間間隔內獲得所有行的計數,經過研究可以使用GROUP BY. 理想情況下,最終輸出看起來像這樣timestamp               count------------------------------1592352000 (8:00pm EST)   38    1592352900 (8:15pm EST)   221592353800 (8:30pm EST)   0 <----- Important, must include periods with 0 entries1592354700 (8:45pm EST)   61...我在這里主要有兩件事的問題:1.能夠在結果中顯示時間戳間隔 2.在一個時間段內顯示 0 行的間隔我目前的嘗試如下,而且是在正確的軌道上,因為那個時間段的數據實際上是正確的 Showing rows 0 - 23 (24 total, Query took 0.0264 seconds.)SELECT count(*) AS total, MINUTE(FROM_UNIXTIME(timestamp)) AS minuteFROM requestsWHERE timestamp >= 1592352000 AND timestamp < (1592352000 + 3600)  GROUP BY MINUTE(FROM_UNIXTIME(timestamp))total   minute  55  32  89  33  64  34  55  35  87  36  82  37  90  38  69  39  74  40  47  41  89  42  53  43  71  44  87  45  72  46  83  47  86  48  83  49  113 50  76  51  77  52  88  53  81  54  28  55  此數據是正確的,但有些時段未在此處顯示(該小時的前 30 分鐘沒有數據,因此第一個minute條目從 32 開始)。還嘗試通過使用每 15 分鐘獲取一次SELECT count(*) AS total, MINUTE(FROM_UNIXTIME(timestamp)) AS minuteFROM requestsWHERE timestamp >= 1592352000 AND timestamp < (1592352000 + 3600)  GROUP BY MINUTE(FROM_UNIXTIME(timestamp)) DIV 15#1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'wave_master.requests.timestamp' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by任何幫助將不勝感激。
查看完整描述

1 回答

?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

您可以使用“數字”表在一小時 (0-3) 內生成 15 分鐘的時間段,然后LEFT JOIN根據您的計數,按 15 分鐘的時間段分組,使用0COALESCE替換值:NULL


SELECT periods.period * 900 + 1592352000 AS timestamp,

? ? ? ?FROM_UNIXTIME(periods.period * 900 + 1592352000) AS time,

? ? ? ?COALESCE(counts.total, 0) AS total

FROM (

? SELECT 0 period

? UNION ALL SELECT 1?

? UNION ALL SELECT 2

? UNION ALL SELECT 3

) periods

LEFT JOIN (

? SELECT (timestamp - 1592352000) DIV 900 AS period,

? ? ? ? ?COUNT(*) AS total

? FROM requests

? WHERE timestamp >= 1592352000 AND timestamp < 1592352000 + 3600

? GROUP BY period

) counts ON counts.period = periods.period

輸出(對于您問題中的數據加上其他幾個值):


timestamp? ?time? ? ? ? ? ? ? ? ? ? total

1592352000? 2020-06-17 00:00:00? ? ?1

1592352900? 2020-06-17 00:15:00? ? ?1

1592353800? 2020-06-17 00:30:00? ? ?5

1592354700? 2020-06-17 00:45:00? ? ?0

查看完整回答
反對 回復 2023-06-18
  • 1 回答
  • 0 關注
  • 174 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號