如何计算所有行的中位数?

2602

我想要完成的是:我想计算每个商店过去 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))

我想知道的是:可以以这种方式使用中值函数吗?如果是这样,我必须在查询组中更改某些内容吗?如果没有,你能推荐另一种方法来解决这个问题吗?

戈登·利诺夫

我不知道你是否可以用窗口函数来做到这一点。相关的分析函数,例如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值。如果您需要考虑这些,请提出一个问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章