PostgreSQL中的PERCENTILE_DISC()作为窗口函数

时间:2016-09-20 13:09:53

标签: sql postgresql window-functions

我们将系统从SQL Server移植到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()作为窗口函数。错误消息是:

  

错误:有序集聚合百分位数_disc

不支持OVER

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

编辑:这是Example_Tbl中的示例输入数据

Company  Dt   Turnover 
x        1    10 
x        2    45 
x        3    20 
y        1    300 
y        2    100  
y        3    200

ouptut应如下所示。请注意,我们现在忽略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  

1 个答案:

答案 0 :(得分:2)

您的partition by子句(PARTITION BY B.Company, B.Dt)正在使用外部查询(别名B)中的值,而不是子查询(别名G),这些不是&#39;起初对我来说很明显。因为B.companyB.Dt的值对于子查询的每次执行都是常量,所以你的partition子句与简单地编写它没有区别:

... over (partition by 1)

如果需要,可以在SQL Server中对其进行测试,但是您会发现结果是相同的。现在,我不知道使用B.Company, B.Dt是否有意,但实际上,这意味着partition by子句实际上并没有对任何内容进行分区。

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