Как я могу вычислить медиану всех строк?

#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 значения. Если вам нужно принять это во внимание, задайте новый вопрос.