我试图在由两列(即一个名为“address_token”的唯一标识符和一个名为“list_date”的日期字段)定义的windows上获取列A的最大值(“original_list_price”)。即,我想知道具有相同地址令牌和列表日期的行的最大“原始列表价格”。
例如。:

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

当我在分区中只使用1个表达式时,查询已经花费了10分钟(例如,只使用子查询,之后没有任何内容)。有时查询超时。(我使用模式分析并得到此错误:发送到后端时发生I/O错误)因此我的问题是:
1)窗口函数的多重分区表达式是否有效?
2)还有其他方法可以达到我想要的结果吗?
3)有没有办法让Windows的功能,特别是分区部分运行得更快?例如,在使用某些数据类型时,尽量避免使用长的字母数字字符串标识符?
谢谢您!

最佳答案

窗口函数划分子句的复杂性不应该对性能有很大的影响。请注意,查询将返回表中的所有行,因此可能有一个非常大的结果集。
窗口函数应该能够利用索引。对于此查询:

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;

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

关于sql - Postgresql用多个分区表达式编写max()窗口函数吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40581911/

10-11 01:20