Joh*_*ohn 2 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;
Run Code Online (Sandbox Code Playgroud)
问题是 PostgreSQL 不支持使用percentile_disc()作为窗口函数。错误信息是:
错误:有序集聚合 percentile_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
Run Code Online (Sandbox Code Playgroud)
输出应如下所示。请注意,我们现在忽略 3 Months,每个公司只有 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
Run Code Online (Sandbox Code Playgroud)
您的partition by子句 ( PARTITION
BY B.Company, B.Dt) 使用的是来自外部查询 (alias B) 的值,而不是子查询 (alias G),这对我来说起初并不明显。因为每次执行子查询时B.company和的值B.Dt都是常量,所以你的分区子句与简单地写成这样实际上没有什么不同:
... over (partition by 1)
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以在 SQL Server 中对其进行测试,但您会发现结果是相同的。现在,我不知道 using 是否B.Company, B.Dt是故意的,但实际上,这意味着该partition by子句实际上并没有划分任何内容。
因此,对您来说,好消息是要在 PostgreSQL 中编写等效的查询,您只需OVER (PARTITION
BY B.Company, B.Dt)完全省略该子句,其行为将与 SQL Server 中的相同。
| 归档时间: |
|
| 查看次数: |
5251 次 |
| 最近记录: |