Среднее с частичными данными в SQL

У меня есть данные, как показано ниже, которые являются частичными, и несколько строк отсутствуют. Мне нужно среднее значение с данными с учетом предыдущего доступного значения. Есть ли у нас какая-нибудь функция для такого среднего значения в sql?

Необходимое среднее: 220

Доступные данные за 10 дней:

1st day: 100
4th day: 200
7th day: 300
10th day: 400

То же самое в виде таблицы:

Rows    Date        Partial Continuous(needed)
1       01-Aug-18   100     100     
2                           100
3                           100
4       04-Aug-18   200     200     
5                           200
6                           200
7       07-Aug-18   300     300     
8                           300
9                           300
10      10-Aug-18   400     400     
-----------------------------------
Average             250     220
-----------------------------------

Я смотрю на что-то вроде select avg(partial*(nextdate-date))/(lastdate-firstdate) from mytable;


person Anu    schedule 09.08.2018    source источник
comment
В вашей таблице у вас, кажется, средние значения задом наперёд.   -  person Barmar    schedule 09.08.2018


Ответы (2)


Используйте определяемую пользователем переменную, чтобы заполнить пропущенные значения.

SELECT AVG(normal)
FROM (SELECT IFNULL(continuous, @prev) AS normal, @prev := IF(continuous IS NULL, @prev, continuous)
      FROM (SELECT continuous
            FROM yourTable
            ORDER BY id) AS x
      CROSS JOIN (SELECT @prev := NULL) AS y
) as z
person Barmar    schedule 09.08.2018

Как насчет AVG()?

> SELECT AVG(Normal) FROM table WHERE something;
person keithpjolley    schedule 09.08.2018
comment
Я не думаю, что столбец normal действительно существует, он просто показывает, что хочет, чтобы строки с отсутствующими значениями наследовали значение из предыдущей строки. - person Barmar; 09.08.2018
comment
ах, мне было интересно, может быть, Ану вычислял Average каким-то странным образом, потому что с указанными числами Среднее значение NormalContinuous) равно 220, а не 250. - person keithpjolley; 09.08.2018
comment
@ keithpjolley: исправлены данные. возможно, он был зашифрован, пока кто-то редактировал его. - person Anu; 09.08.2018