Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-平均忽略空值并基于工作日_Mysql_Null_Average_Data Analysis_Weekday - Fatal编程技术网

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

MySQL-平均忽略空值并基于工作日,mysql,null,average,data-analysis,weekday,Mysql,Null,Average,Data Analysis,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 2

我试图对以下数据进行一些分析

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个相同工作日的平均值。但是,当工作日中存在空值时,我希望忽略并仅对剩余的数字进行平均,而不是将空值计算为0。这里我给大家举个例子:

此表中的日期为日/月/年:

例:2018年10月12日,我需要 2018年10月5日;28/09/2018; 21/09/2018. 这是与2018年10月12日相同的最后3个工作日。 . 它们的值为空;29; 17那么这个平均值的结果必须是23,因为我需要忽略空值,而不是15333

如何执行此操作?

在选择中使用IsNULLCount,0

SELECT WeekDay, AVG(Count)
FROM myTable
WHERE Count IS NOT NULL
GROUP BY WeekDay
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
从这里,你可以得到你想要的。根据您的解释,您不需要为count过滤掉空值。仅仅做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
e、 g.sumvalue高于=46,countvalue=2,因此平均值为23.0,avgvalue也将返回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
您可以在上面的查询中使用avgcount,并得到相同的结果


另外,我希望您不要使用count作为列名!我还建议您也不要使用date作为列名。i、 e.避免使用SQL术语作为名称。

如果Count不是null,MySQL应该是一个标记,而不仅仅是在标题中。但是MySQL现在的版本8有了新的特性,那么您使用的是哪个版本的MySQL呢?平均值函数也会忽略空值。实际上,所有聚合函数都忽略空值。From:除非另有说明,否则组函数忽略空值。谢谢您的回答。但我需要为每个日期的平均值从过去3个相同的工作日。例如,在2018年10月12日,我需要2018年10月5日的平均值;28/09/2018; 21/09/2018. 这是与2018年10月12日相同的最后3个工作日。然后,从2018年10月11日开始,我需要2018年10月4日、2018年9月17日和2018年9月20日的平均值,以此类推。每天从我的数据