average忽略null并基于工作日

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

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

  1. WeekDay Date Count
  2. 5 06/09/2018 20
  3. 6 07/09/2018 Null
  4. 7 08/09/2018 19
  5. 1 09/09/2018 16
  6. 2 10/09/2018 17
  7. 3 11/09/2018 24
  8. 4 12/09/2018 25
  9. 5 13/09/2018 24
  10. 6 14/09/2018 23
  11. 7 15/09/2018 23
  12. 1 16/09/2018 9
  13. 2 17/09/2018 23
  14. 3 18/09/2018 33
  15. 4 19/09/2018 22
  16. 5 20/09/2018 31
  17. 6 21/09/2018 17
  18. 7 22/09/2018 10
  19. 1 23/09/2018 12
  20. 2 24/09/2018 26
  21. 3 25/09/2018 29
  22. 4 26/09/2018 27
  23. 5 27/09/2018 24
  24. 6 28/09/2018 29
  25. 7 29/09/2018 27
  26. 1 30/09/2018 19
  27. 2 01/10/2018 26
  28. 3 02/10/2018 39
  29. 4 03/10/2018 32
  30. 5 04/10/2018 37
  31. 6 05/10/2018 Null
  32. 7 06/10/2018 26
  33. 1 07/10/2018 11
  34. 2 08/10/2018 32
  35. 3 09/10/2018 41
  36. 4 10/10/2018 37
  37. 5 11/10/2018 25
  38. 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。
我该怎么做?

iih3973s

iih3973s1#

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

  1. create table table2
  2. as
  3. select
  4. row_number() over(partition by weekday order by date desc) as rn
  5. ,weekday
  6. ,date
  7. ,count
  8. from table

从这里,你可以得到你想要的。根据您的解释,您不需要为count过滤掉空值。仅仅做avg()聚合就可以忽略它。

  1. select
  2. weekday
  3. ,avg(count)
  4. from table2
  5. where rn in (1,2,3)
  6. group by weekday
展开查看全部
qq24tv8q

qq24tv8q2#

  1. SELECT WeekDay, AVG(Count)
  2. FROM myTable
  3. WHERE Count IS NOT NULL
  4. GROUP BY WeekDay
z2acfund

z2acfund3#

这个 count() 函数忽略空值(即遇到空值时不递增),因此我建议您只需计算值,然后可能包含希望忽略的空值。

  1. dow datecol value
  2. 6 21/09/2018 17
  3. 6 28/09/2018 29
  4. 6 05/10/2018 Null

例如。 sum(value) 大于等于46,且 count(value) =2,平均值为23.0(和 avg(value) 也将返回23.0,因为它也忽略空值)

  1. select
  2. weekday
  3. , `date`
  4. , `count`
  5. , (select (sum(`count`) * 1.0) / (count(`count`) * 1.0)
  6. from atable as t2
  7. where t2.weekday = t1.weekday
  8. and t2.`date` < t1.`date
  9. order by t2.`date` DESC
  10. limit 3
  11. ) as average
  12. from atable as t1

你可以用 avg(count) 并得到相同的结果。
我真的希望你不要用 count 作为列名!我也建议你不要用 date 作为列名。i、 e.避免使用sql术语作为名称。

展开查看全部
0aydgbwb

0aydgbwb4#

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

  1. SELECT WeekDay, AVG(IsNULL(Count,0))
  2. FROM myTable
  3. GROUP BY WeekDay

相关问题