我们将系统从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
答案 0 :(得分:2)
您的partition by
子句(PARTITION
BY B.Company, B.Dt
)正在使用外部查询(别名B
)中的值,而不是子查询(别名G
),这些不是&#39;起初对我来说很明显。因为B.company
和B.Dt
的值对于子查询的每次执行都是常量,所以你的partition子句与简单地编写它没有区别:
... over (partition by 1)
如果需要,可以在SQL Server中对其进行测试,但是您会发现结果是相同的。现在,我不知道使用B.Company, B.Dt
是否有意,但实际上,这意味着partition by
子句实际上并没有对任何内容进行分区。
因此,对您而言,好消息是要在PostgreSQL中编写等效查询,您只需要完全省略OVER (PARTITION
BY B.Company, B.Dt)
子句,行为将与SQL Server中的行为相同。