What I’m trying to accomplish: I’d like to calculate the median number of rows for the last 49 days for each store and hour of the day (0 – 24 hours).
What I’ve done so far:
My current SQL is below. I’m using the median function incorrectly and am receiving the following error:  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))
What I’d like to know: Can the median function be used in this manner? If so, is there something I have to change in the group by of the query? If not, can you recommend another way to solve this issue?
Advertisement
Answer
I don’t know if you can do this with window functions.  The relevant analytic functions, such as median do not work cumulatively.
But you can use a lateral join:
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;
Note: It is not clear what you mean by 49 days. I assume you want exactly 7 weeks which is 48 days in the past plus the current date on the row.
Also, this ignores 0 values.  If you need to take those into account, then ask a new question.