MySQL - Average ignoring Null and based on weekday

mysql average group by
mysql average count
mysql average multiple columns
mysql average multiple rows
mysql avg returns null
mysql if
mysql avg subquery
syntax for avg in mysql

I´m trying to do some analysis in the following data

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  

The problem that I want to solve is: I want to create a table with the average of the 3 last same weekdays related to the day. But, when there is a NULL in the weekday, I want to ignore and do the average only with the remain numbers, not count NULL as an 0. I will give you an example here:

The date in this table is day/month/year :)

Ex: On day 12/10/2018, I need the average from the days 05/10/2018; 28/09/2018; 21/09/2018. These are the last 3 same weekday(six) as 12/10/2018. . Their values are Null; 29; 17. Then the result of this average must be 23, because I need to ignore the NULL, and not be 15,333.

How can I do this?

The count() function ignores nulls (i.e. does NOT increment if it encounters null) so I suggest you simply count the values then may contain the nulls you wish to ignore.

dow datecol     value
6   21/09/2018  17
6   28/09/2018  29
6   05/10/2018  Null

e.g. sum(value) above = 46, and the count(value) = 2 so the average is 23.0 (and avg(value) will also return 23.0 as it also ignores nulls)

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

You could just use avg(count) in the query above, and get the same result.

ps. I do hope you do NOT use count as a column name! I also would suggest you do NOT use date as a column name either. i.e. Avoid using SQL terms as names.

MySQL Cookbook: Solutions for Database Developers and Administrators, If not, the expression evaluates to NULL and COUNT() ignores it. The effect is to count the number of values that satisfy the condition given as the first argument  The AVG () function returns the average value of an expression. Note: NULL values are ignored. AVG ( expression) Parameter Values. Required. A numeric value (can be a field or a formula) Technical Details. Select the records that have a price above the average price: SELECT * FROM Products. WHERE Price > (SELECT AVG (Price) FROM Products);

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

MySQL AVG() Function Explained by Practical Examples, This tutorial shows you how to use the MySQL AVG function with many practical examples of how The AVG() function ignores NULL values in the calculation. I want column t to be their weighted average (each of a..f have static weights which I assign), ignoring null values (which can occur in any of them), except being null if they're all null. I would prefer to do this with a simple SQL calculation, rather than doing it in app code or using some huge ugly nested if block to handle every permutation of nulls.

Use IsNULL(Count,0) in your Select

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

Functions for Use in SELECT and WHERE Clauses, If one or both arguments are NULL, the result of the comparison is NULL, IFNULL( ) returns a numeric or string value, depending on the context in mysql​> SELECT WEEKDAY('1997-10-04 22:23:00'); -> 5 mysql> SELECT ENCRYPT​( ) ignores all but the first 8 characters of str, at least on some systems. AVG(​expr). MySQL WEEKDAY() function Last update on February 26 2020 08:08:23 (UTC/GMT +8 hours)

First off, you need to get the number of instances of that weekday in the data since you just need the last 3 same week days

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

From here, you can get what you want. With you explanation, you don't need to filter out the NULL values for count. Just doing the avg() aggregation will simply ignore it.

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

MySQL 5.7 Reference Manual :: 12.6 Date and Time , DAYOFWEEK(), Return the weekday index of the argument Functions that expect date values usually accept datetime values and ignore the time part. Other functions expect complete dates and return NULL for incomplete dates. as a value in 'hh:mm:ss' or hhmmss format, depending on whether the function is used in  The WEEKDAY() function returns the weekday number for a given date. Note: 0 = Monday, 1 = Tuesday, 2 = Wednesday, 3 = Thursday, 4 = Friday, 5 = Saturday, 6 = Sunday. Syntax

Common MySQL Queries, Common Queries,MySQL Queries,Common SQL Queries. Aggregates excluding leaders · Aggregates of Average top 50% values per group Compute date from year, week number and weekday List NULLs at end of query output. SELECT distinct AVG(cast(ISNULL(a.SecurityW,0) as bigint)) as Average1 ,AVG(cast(ISNULL(a.TransferW,0) as bigint)) as Average2 ,AVG(cast(ISNULL(a.StaffW,0) as bigint)) as Average3 FROM Table1 a, Table2 b WHERE a.SecurityW <> 0 AND a.SecurityW IS NOT NULL AND a.TransferW<> 0 AND a.TransferWIS NOT NULL AND a.StaffW<> 0 AND a.StaffWIS NOT NULL AND MONTH(a.ActualTime) = 4 AND YEAR(a.ActualTime) = 2013

SQL AVG() function introduction and examples, This article describes the SQL Average function with examples and illustrations. Also, we As we can see, AVG() considers all weekdays and weekends values in its If we want to ignore duplicate values during the AVG() function AVG() function does not consider the NULL values during its calculation. DAYNAME() function. MySQL DAYNAME() returns the name of the week day of a date specified in the argument. Syntax: DAYNAME(date1) Where date1 is a date.. Syntax Diagram:

MySQL Tutorial - MySQL By Examples for Beginners, "southwind" has no table (empty set). mysql> SHOW TABLES; Empty set (0.00 sec) For example, you can SELECT an expression or evaluate a built-in function. functions (such as COUNT() , AVG() , SUM() ) to produce group summary. -p --all-databases --ignore-table=mysql.user > backupServer.sql -- Dump all the  Unless otherwise stated, group functions ignore NULL values. If you use a group function in a statement containing no GROUP BY clause, it is equivalent to grouping on all rows. For more information, see Section 12.20.3, “MySQL Handling of GROUP BY”. Most aggregate functions can be used as window functions.

Comments
  • Where Count is not null
  • MySQL should be a tag, not just in the title. But MySQL now has version 8 with new features, so what version of MySQL are you using please?
  • Average function also ignores Nulls. Infact, all the aggregation functions ignore nulls. From docs: "Unless otherwise stated, group functions ignore NULL values."
  • Thank you for your answer. But I need for each date its avg from the last 3 same weekday. So for example On day 12/10/2018, I need the average from the days 05/10/2018; 28/09/2018; 21/09/2018. These are the last 3 same weekday(six) as 12/10/2018. Then, from day 11/10/2018 I want the avg from 04/10/2018, 17/09/2018 and 20/09/2018 and so on. For every day from my data