获取按日期分组的计数(列)的平均值,但满足某些条件
Getting average of count(column) grouped by date, but meeting certain conditions
数据样本:
dtime
id
2021-01-0106:00:00
1
2021-01-0106:00:00
2
2021-01-0106:00:00
3
...
...
2021-01-0112:00:00
1
2021-01-0112:00:00
2
2021-01-0112:00:00
3
...
...
...
...
2021-01-1220:00:00
1
2021-01-1220:00:00
2
2021-01-1220:00:00
3
在真实数据集中,id
s 介于 1 和 9999 之间,dtime
每 5 分钟,24 小时/天,我想只在特定时间采样(例如 06 , 12, 16, 20h).
预期输出是 count(id)
个值的平均值,按 DATE(dtime)
分组,但是:
- 只有某些
TIME(dtime)
应该被采样(例如 06、12、16、20h);
count(id)
应该忽略不在 10 到 500 之间的 id
;
如果 <3.,count(id)
应该被丢弃(并且不考虑平均值)
输出样本:
日期(dtime)
AVG(计数(id))
2021-01-01
31
2021-01-02
29
到目前为止我有:
SELECT dtime,count(id)
FROM cron5min
WHERE (TIME(dtime) = '06:00:00' OR TIME(dtime) = '12:00:00' OR TIME(dtime) = '16:00:00' OR TIME(dtime) = '20:00:00') AND id BETWEEN 10 AND 500 AND estado = 1
GROUP BY dtime
然后我使用 PHP 根据 3.
进行平均并丢弃数据
我现在正在尝试仅使用 MySQL 语句来执行此操作,而不是 PHP.
您需要 2 个聚合级别:
SELECT DATE(dtime) date, AVG(counter) avg_count
FROM (
SELECT dtime, COUNT(id) counter
FROM cron5min
WHERE TIME(dtime) IN ('06:00:00', '12:00:00', '16:00:00', '20:00:00')
AND id BETWEEN 10 AND 500
AND estado = 1
GROUP BY dtime
HAVING counter >= 3
) t
GROUP BY date
数据样本:
dtime | id |
---|---|
2021-01-0106:00:00 | 1 |
2021-01-0106:00:00 | 2 |
2021-01-0106:00:00 | 3 |
... | ... |
2021-01-0112:00:00 | 1 |
2021-01-0112:00:00 | 2 |
2021-01-0112:00:00 | 3 |
... | ... |
... | ... |
2021-01-1220:00:00 | 1 |
2021-01-1220:00:00 | 2 |
2021-01-1220:00:00 | 3 |
在真实数据集中,id
s 介于 1 和 9999 之间,dtime
每 5 分钟,24 小时/天,我想只在特定时间采样(例如 06 , 12, 16, 20h).
预期输出是 count(id)
个值的平均值,按 DATE(dtime)
分组,但是:
- 只有某些
TIME(dtime)
应该被采样(例如 06、12、16、20h); count(id)
应该忽略不在 10 到 500 之间的id
;
如果 <3.,count(id)
应该被丢弃(并且不考虑平均值)
输出样本:
日期(dtime) | AVG(计数(id)) |
---|---|
2021-01-01 | 31 |
2021-01-02 | 29 |
到目前为止我有:
SELECT dtime,count(id)
FROM cron5min
WHERE (TIME(dtime) = '06:00:00' OR TIME(dtime) = '12:00:00' OR TIME(dtime) = '16:00:00' OR TIME(dtime) = '20:00:00') AND id BETWEEN 10 AND 500 AND estado = 1
GROUP BY dtime
然后我使用 PHP 根据 3.
进行平均并丢弃数据我现在正在尝试仅使用 MySQL 语句来执行此操作,而不是 PHP.
您需要 2 个聚合级别:
SELECT DATE(dtime) date, AVG(counter) avg_count
FROM (
SELECT dtime, COUNT(id) counter
FROM cron5min
WHERE TIME(dtime) IN ('06:00:00', '12:00:00', '16:00:00', '20:00:00')
AND id BETWEEN 10 AND 500
AND estado = 1
GROUP BY dtime
HAVING counter >= 3
) t
GROUP BY date