MySQL - среднее значение, игнорирующее ноль и основанное на дне недели - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь провести некоторый анализ следующих данных

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 последних дня недели, связанных сдень.Но когда в будний день есть NULL, я хочу игнорировать и делать среднее только с оставшимися числами, а не считать NULL как 0. Я приведу здесь пример:

Дата в этомтаблица день / месяц / год:)

Пример: в день 12/10/2018 мне нужно среднее значение по дням 05/10/2018;28/09/2018;21/09/2018.Это последние 3 дня (шесть) того же дня недели, что и 12/10/2018.,Их значения нулевые;29;17. Тогда результат этого среднего должен быть 23, потому что мне нужно игнорировать NULL, а не 15,333.

Как я могу это сделать?

Ответы [ 4 ]

0 голосов
/ 18 октября 2018

Функция 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 в качестве имени столбца.т.е. избегать использования терминов SQL в качестве имен.

0 голосов
/ 18 октября 2018

Используйте IsNULL(Count,0) в вашем выборе

SELECT WeekDay, AVG(IsNULL(Count,0))
FROM myTable
GROUP BY WeekDay
0 голосов
/ 18 октября 2018

Прежде всего, вам нужно получить количество экземпляров этого дня недели в данных, поскольку вам просто нужны последние 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
0 голосов
/ 18 октября 2018
SELECT WeekDay, AVG(Count)
FROM myTable
WHERE Count IS NOT NULL
GROUP BY WeekDay
...