【问题标题】:MySQL - Average ignoring Null and based on weekdayMySQL - 平均忽略 Null 并基于工作日
【发布时间】:2019-03-22 17:08:05
【问题描述】:

我正在尝试对以下数据进行一些分析

WeekDay Date    Count   
5   06/09/2018  20  
6   07/09/2018  Null    
7   08/09/2018  19  
1   09/09/2018  16  
2   10/09/2018  17  
3   11/09/2018  24  
4   12/09/2018  25  
5   13/09/2018  24  
6   14/09/2018  23  
7   15/09/2018  23  
1   16/09/2018  9   
2   17/09/2018  23  
3   18/09/2018  33  
4   19/09/2018  22  
5   20/09/2018  31  
6   21/09/2018  17  
7   22/09/2018  10  
1   23/09/2018  12  
2   24/09/2018  26  
3   25/09/2018  29  
4   26/09/2018  27  
5   27/09/2018  24  
6   28/09/2018  29  
7   29/09/2018  27  
1   30/09/2018  19  
2   01/10/2018  26  
3   02/10/2018  39  
4   03/10/2018  32  
5   04/10/2018  37  
6   05/10/2018  Null    
7   06/10/2018  26  
1   07/10/2018  11  
2   08/10/2018  32  
3   09/10/2018  41  
4   10/10/2018  37  
5   11/10/2018  25  
6   12/10/2018  20  

我要解决的问题是:我想创建一个表,其中包含与当天相关的最后 3 个工作日的平均值。但是,当工作日有 NULL 时,我想忽略并仅对剩余数字进行平均,而不是将 NULL 计为 0。我将在这里举个例子:

此表中的日期是日/月/年:)

例如:在 2018 年 12 月 10 日,我需要从 2018 年 5 月 10 日的日子; 28/09/2018; 2018 年 9 月 21 日。这些是与 2018 年 12 月 10 日相同的最后 3 个工作日(六个)。 .它们的值为 Null; 29; 17. 那么这个平均的结果一定是23,因为我需要忽略NULL,而不是15333。

我该怎么做?

【问题讨论】:

  • Count 不为空的地方
  • MySQL 应该是一个标签,而不仅仅是在标题中。但是MySQL现在有新的8版本了,请问你用的是什么版本的MySQL呢?

标签: mysql null average data-analysis weekday


【解决方案1】:

count() 函数忽略空值(即,如果遇到空值则不会增加)所以我建议您简单地计算值然后可能包含您希望忽略的空值。

dow datecol     value
6   21/09/2018  17
6   28/09/2018  29
6   05/10/2018  Null

例如sum(value) 以上 = 46,count(value) = 2 所以平均值为 23.0(avg(value) 也将返回 23.0,因为它也会忽略空值)

select
      weekday
    , `date`
    , `count`
    , (select (sum(`count`) * 1.0) / (count(`count`) * 1.0)
       from atable as t2
       where t2.weekday = t1.weekday
       and t2.`date` < t1.`date
       order by t2.`date` DESC
       limit 3
      ) as average
from atable as t1

您可以在上面的查询中使用avg(count),并获得相同的结果。

ps。我希望您不要使用count 作为列名!我还建议您也不要使用 date 作为列名。即避免使用 SQL 术语作为名称。

【讨论】:

  • Average 函数也忽略 Null。事实上,所有聚合函数都会忽略空值。来自docs:“除非另有说明,否则组函数会忽略 NULL 值。”
【解决方案2】:
SELECT WeekDay, AVG(Count)
FROM myTable
WHERE Count IS NOT NULL
GROUP BY WeekDay

【讨论】:

    【解决方案3】:

    在您的选择中使用IsNULL(Count,0)

    SELECT WeekDay, AVG(IsNULL(Count,0))
    FROM myTable
    GROUP BY WeekDay
    

    【讨论】:

      【解决方案4】:

      首先,您需要在数据中获取该工作日的实例数,因为您只需要最后 3 个相同的工作日

      create table table2
      as
      select
          row_number() over(partition by weekday order by date desc) as rn
         ,weekday
         ,date
         ,count
      from table
      

      从这里,你可以得到你想要的。有了你的解释,你不需要过滤掉count的NULL值。只是做 avg() 聚合将简单地忽略它。

      select
          weekday
         ,avg(count)
      from table2
      where rn in (1,2,3)
      group by weekday
      

      【讨论】:

      • 感谢您的回答。但我需要每个日期的平均值从最后 3 个相同的工作日开始。因此,例如在 2018 年 12 月 10 日,我需要 2018 年 5 月 10 日的平均值; 28/09/2018; 2018 年 9 月 21 日。这些是与 2018 年 12 月 10 日相同的最后 3 个工作日(六个)。然后,从 2018 年 11 月 10 日开始,我想要 04/10/2018、17/09/2018 和 20/09/2018 等的平均值。来自我的数据的每一天
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 2013-03-15
      • 1970-01-01
      • 2020-03-28
      • 2012-04-21
      • 1970-01-01
      相关资源
      最近更新 更多