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

Postgresql使用多个分区表达式编写max()窗口函数?,sql,postgresql,window-functions,Sql,Postgresql,Window Functions,我试图在由两列定义的窗口中获取列A(“原始列表价格”)的最大值(即,一个唯一标识符,称为“地址令牌”,一个日期字段,称为“列表日期”)。即,我想知道具有相同地址令牌和列表日期的行的最大“原始列表价格” 例如: 当我在分区中只使用1个表达式时,查询已经花费了>10分钟(例如,仅使用address_标记,之后什么都不使用)。有时查询超时。(我使用Mode Analytics并得到此错误:发送到后端时发生I/O错误)因此我的问题是: 1) 具有多个分区表达式的窗口函数是否有效 2) 还有其他方法可以达

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

例如:

当我在分区中只使用1个表达式时,查询已经花费了>10分钟(例如,仅使用address_标记,之后什么都不使用)。有时查询超时。(我使用Mode Analytics并得到此错误:发送到后端时发生I/O错误)因此我的问题是:

1) 具有多个分区表达式的窗口函数是否有效

2) 还有其他方法可以达到我想要的结果吗

3) 有没有办法让Windows功能,特别是分区部分运行得更快?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;
您需要在
表1(地址\u标记、列表\u日期、原始列表\u价格)上建立索引

您可以尝试将查询编写为:

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;

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

从子查询中得到启发,我现在尝试编写一个子查询,它以某种方式(按原始列表价格描述排序)对数据进行排序,这样每个组的顶部值(按地址标记和列表日期分组)将是所需的行(即地址标记和列表日期组合的最大原始列表价格)。作为后续问题:我记得有一种方法可以在单独的子查询中只获取组的最高值?选择distinct maybe?@LauraD…新问题应该作为问题而不是评论提出。如果您正在寻找组的最高值,请问另一个问题,因为这不是此问题所问的问题(改变这个问题是不礼貌的,因为它可能会使这个答案无效,这会吸引选票)。我想知道你是否在寻找分组集/汇总
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;