Postgresql使用多个分区表达式编写max()窗口函数?

时间:2016-11-14 04:30:50

标签: sql postgresql window-functions

我试图通过2列定义的窗口获取A列的最大值(" original_list_price") - 一个唯一的标识符,名为" address_token"和日期字段,名为" list_date")。即我想知道max" original_list_price"具有相同address_token和list_date的行。

E.g:

SELECT 
address_token, list_date, original_list_price, 
max(original_list_price) OVER (PARTITION BY address_token, list_date) as max_list_price
FROM table1  

当我在PARTITION中仅使用1个表达式时,查询已经花了> 10分钟(例如,仅使用address_token,之后没有任何内容)。有时查询超时。 (我使用Mode Analytics并收到此错误:发送到后端时发生I / O错误)所以我的问题是:

1)具有多个PARTITION BY表达式的Window函数是否有效?

2)是否有其他方法可以达到我想要的效果?

3)任何使Windows功能,特别是分区部分运行得更快的方法?例如使用某些数据类型而不是其他数据类型,尽量避免使用长字母数字字符串标识符?

谢谢!

1 个答案:

答案 0 :(得分:1)

窗口函数分区子句的复杂性不应对性能产生很大影响。请注意,您的查询正在返回 all 表中的行,因此可能会有非常大的结果集。

窗口函数应该能够利用索引。对于此查询:

SELECT address_token, list_date, original_list_price, 
       max(original_list_price) OVER (PARTITION BY address_token, list_date) as max_list_price
FROM table1;

您需要table1(address_token, list_date, original_list_price)上的索引。

可以尝试将查询编写为:

select t1.*,
       (select max(t2.original_list_price)
        from table1 t2
        where t2.address_token = t1.address_token and t2.list_date = t1.list_date
       ) as max_list_price
from table1 t1;

这应该更快地返回结果,因为它不必在返回值之前首先计算窗口函数值(对于所有行)。