#sql #oracle
#sql #Oracle
Вопрос:
Чего я пытаюсь достичь: я хотел бы вычислить среднее количество строк за последние 49 дней для каждого хранилища и часа дня (0-24 часа).
Что я сделал до сих пор: мой текущий SQL приведен ниже. Я неправильно использую функцию медианы и получаю следующую ошибку: not a single-group group function
.
SELECT
store,
EXTRACT(HOUR FROM CAST(date AS TIMESTAMP)) AS hour_of_day,
median(count(*))
FROM table
WHERE date >= trunc(sysdate - 49)
GROUP BY
store,
EXTRACT(HOUR FROM CAST(date AS TIMESTAMP))
Что я хотел бы знать:
Можно ли использовать функцию медианы таким образом? Если да, есть ли что-то, что я должен изменить в group by запроса? Если нет, можете ли вы порекомендовать другой способ решения этой проблемы?
Комментарии:
1. Пометьте свой вопрос базой данных, которую вы используете.
2. Какую СУБД вы используете?
3. Oracle, спасибо, что указали на это.
4. Не могли бы вы предоставить некоторые образцы данных и выходные данные, которые вы ожидаете от этих образцов данных?
Ответ №1:
Я не знаю, можете ли вы сделать это с помощью оконных функций. Соответствующие аналитические функции, такие как median
, не работают кумулятивно.
Но вы можете использовать боковое соединение:
with dh as (
select trunc(date) as dte, extract(hour from date) as hh,
shop, count(*) as cnt
from t
)
select dh.*, m.median_cnt
from dh cross join lateral
(select median(cnt) as median_cnt
from dh dh2
where dh2.hh = dh.hh and
dh2.dte >= dh.dte - interval '48' day and
dh2.dte <= dte
) m;
Примечание: неясно, что вы подразумеваете под 49 днями. Я предполагаю, что вам нужно ровно 7 недель, что составляет 48 дней в прошлом, плюс текущая дата в строке.
Кроме того, это игнорирует 0
значения. Если вам нужно принять это во внимание, задайте новый вопрос.