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.company
和 B.Dt
的值对于子查询的每次执行都是不变的,那么你的分区子句实际上与简单地这样写没有什么不同:
... over (partition by 1)
如果你愿意,你可以在SQL服务器上测试它,但你会发现结果是一样的。现在,我不知道使用 B.Company, B.Dt
是否有意或无意,但实际上,这意味着 partition by
子句实际上并没有分区任何东西。
因此,对您来说,好消息是要在 PostgreSQL 中编写等效查询,您只需完全省略 OVER (PARTITION
BY B.Company, B.Dt)
子句,行为将是与 SQL 服务器相同。
我们正在将我们的系统从 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.company
和 B.Dt
的值对于子查询的每次执行都是不变的,那么你的分区子句实际上与简单地这样写没有什么不同:
... over (partition by 1)
如果你愿意,你可以在SQL服务器上测试它,但你会发现结果是一样的。现在,我不知道使用 B.Company, B.Dt
是否有意或无意,但实际上,这意味着 partition by
子句实际上并没有分区任何东西。
因此,对您来说,好消息是要在 PostgreSQL 中编写等效查询,您只需完全省略 OVER (PARTITION
BY B.Company, B.Dt)
子句,行为将是与 SQL 服务器相同。