繁体   English   中英

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

[英]How can I calculate the median of all rows?

我想要完成的是:我想计算每个商店过去 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值。 如果您需要考虑这些,请提出一个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM