Предполагая, что все статьи имеют по крайней мере одного автора:
select count(*) * 1.0 / count(distinct paper_id)
from authors;
* 1.0
, чтобы избежать целочисленного деления.
Это просто не в моей голове, и я уже выхожу за дверь, так что это не проверено. Я также не могу представить, что он будет очень хорошо работать с любым большим набором данных. Я подтвердил, что он, по крайней мере, работает без ошибок. :)
SELECT
value_column1,
(
SELECT
AVG(value_column1) AS moving_average
FROM
Table1 T2
WHERE
(
SELECT
COUNT(*)
FROM
Table1 T3
WHERE
date_column1 BETWEEN T2.date_column1 AND T1.date_column1
) BETWEEN 1 AND 20
)
FROM
Table1 T1
Когда у меня возникла похожая проблема, я по разным причинам стал использовать временные таблицы, но это упростило задачу! То, что я сделал, с точки зрения схемы очень похоже на то, что вы делаете.
Сделайте схему чем-то вроде ID identity, start_date, end_date, value. Когда вы выбираете, выполните подвыбор среднего из предыдущих 20 на основе идентификатора идентификатора.
Делайте это только в том случае, если вы уже используете временные таблицы по другим причинам (я нажимаю одни и те же строки снова и снова для разных показателей, поэтому было полезно иметь небольшой набор данных).
Подход Тома Х сработает. Вы можете упростить это следующим образом, если у вас есть столбец идентификаторов:
SELECT T1.id, T1.value_column1, avg(T2.value_column1)
FROM table1 T1
INNER JOIN table1 T2 ON T2.Id BETWEEN T1.Id-19 AND T1.Id