【问题标题】:Getting average of count(column) grouped by date, but meeting certain conditions获取按日期分组的计数(列)的平均值,但满足某些条件
【发布时间】:2021-07-14 17:11:52
【问题描述】:

数据样本:

dtime id
2021-01-01 06:00:00 1
2021-01-01 06:00:00 2
2021-01-01 06:00:00 3
... ...
2021-01-01 12:00:00 1
2021-01-01 12:00:00 2
2021-01-01 12:00:00 3
... ...
... ...
2021-01-12 20:00:00 1
2021-01-12 20:00:00 2
2021-01-12 20:00:00 3

在真实数据集中,ids 介于 1 和 9999 之间,dtime 是每 5 分钟,每天 24 小时,我只想在特定时间(例如 06、12、16、20h)进行采样)。

预期输出是count(id) 值的平均值,按DATE(dtime) 分组,但是:

  1. 只应采样某些TIME(dtime)(例如06、12、16、20h);
  2. count(id) 应该忽略不在 10 到 500 之间的 id;
  3. 如果 ,count(id) 应该被丢弃(并且不考虑平均值)

输出样本:

DATE(dtime) AVG(count(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。

【问题讨论】:

    标签: mysql group-by count average sql-date-functions


    【解决方案1】:

    您需要 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 2022-11-18
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多