PERCENTILE_DISC() 在 PostgreSQL 中作为 window 函数

PERCENTILE_DISC() in PostgreSQL as a window function

我们正在将我们的系统从 SQL 服务器移植到 PostgreSQL。其中,我们计算所有公司在过去 3 个月的所有日期的每日营业额中值。下面是相同

的简化查询
SELECT B.Company, B.Dt, B.Turnover,   (Select distinct
PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY Turnover)  OVER (PARTITION
BY B.Company, B.Dt) from Example_Tbl AS G  where G.Company = B.Company
and G.Dt <= B.Dt and  G.Dt > DateAdd(dd, -92, B.Dt)) as
Med_3m_Turnover FROM Example_Tbl B;

问题是 PostgreSQL 不支持将 percentile_disc() 作为 window 函数使用。错误信息是:

ERROR: OVER is not supported for ordered-set aggregate percentile_disc

有什么方法可以使用 Postgre 中的其他东西实现相同的功能SQL。

编辑:这是 Example_Tbl

中的示例输入数据
Company  Dt   Turnover 
x        1    10 
x        2    45 
x        3    20 
y        1    300 
y        2    100  
y        3    200

输出应该如下所示。请注意,我们现在忽略 3 个月,每个公司只有 3 行

Company  Dt   Turnover   Med_3m_Turnover
x        1    10         10 
x        2    45         10 or 45 depending on percentile_desc
x        3    20         20 
y        1    300        300 
y        2    100        300 or 100 depending on percentile_desc
y        3    50         100  

您的 partition by 子句 (PARTITION BY B.Company, B.Dt) 使用的是来自外部查询(别名 B)的值,而不是子查询(别名 G),这不是'一开始对我来说不是很明显。因为 B.companyB.Dt 的值对于子查询的每次执行都是不变的,那么你的分区子句实际上与简单地这样写没有什么不同:

... over (partition by 1)

如果你愿意,你可以在SQL服务器上测试它,但你会发现结果是一样的。现在,我不知道使用 B.Company, B.Dt 是否有意或无意,但实际上,这意味着 partition by 子句实际上并没有分区任何东西。

因此,对您来说,好消息是要在 PostgreSQL 中编写等效查询,您只需完全省略 OVER (PARTITION BY B.Company, B.Dt) 子句,行为将是与 SQL 服务器相同。