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

Sql 如何计算所有行的中位数?,sql,oracle,Sql,Oracle,我正在努力实现的目标: 我想计算过去49天每个商店的中位数行数,以及每天0-24小时的小时数 到目前为止我所做的: 我当前的SQL如下所示。我错误地使用了中值函数,并收到以下错误:没有一个单一的组函数 我想知道的是: 中值函数可以这样使用吗?如果是这样,我是否必须在查询的分组中更改某些内容?如果没有,你能推荐另一种方法来解决这个问题吗?我不知道你是否能用窗口功能来解决这个问题。相关的分析函数(如中值)不会累积工作 但您可以使用横向连接: with dh as ( select tru

我正在努力实现的目标: 我想计算过去49天每个商店的中位数行数,以及每天0-24小时的小时数

到目前为止我所做的: 我当前的SQL如下所示。我错误地使用了中值函数,并收到以下错误:没有一个单一的组函数

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

我不知道你是否能用窗口功能来解决这个问题。相关的分析函数(如中值)不会累积工作

但您可以使用横向连接:

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个值。如果需要考虑这些,请提出一个新问题。

用您正在使用的数据库标记您的问题。您使用的是哪种dbms?Oracle,感谢您指出这一点。能否提供一些示例数据以及您希望从该示例数据中获得的输出?
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;