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 术语作为名称。
我正在尝试对以下数据进行一些分析
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 术语作为名称。