average忽略null并基于工作日

ghhaqwfi  于 2021-06-20  发布在  Mysql
关注(0)|答案(4)|浏览(499)

我´我试图对以下数据做一些分析

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个工作日(6个)。它们的值为空;29; 17那么这个平均值的结果必须是23,因为我需要忽略空值,而不是15333。
我该怎么做?

tf7tbtn2

tf7tbtn21#

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

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

ac1kyiln2#

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

bn31dyow3#

这个 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) 并得到相同的结果。
我真的希望你不要用 count 作为列名!我也建议你不要用 date 作为列名。i、 e.避免使用sql术语作为名称。

z9gpfhce

z9gpfhce4#

首先,您需要在数据中获得该工作日的示例数,因为您只需要最后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

相关问题