MySQL - 平均忽略 Null 并基于工作日

MySQL - Average ignoring Null and based on weekday

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

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  

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

这个 table 中的日期是 day/month/year :)

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

我该怎么做?

SELECT WeekDay, AVG(Count)
FROM myTable
WHERE Count IS NOT NULL
GROUP BY WeekDay

在 Select

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

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

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

在这里,你可以得到你想要的。有了你的解释,你不需要过滤掉计数的 NULL 值。仅进行 avg() 聚合将简单地忽略它。

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

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) 也将 return 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 术语作为名称。