我试图通过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功能,特别是分区部分运行得更快的方法?例如使用某些数据类型而不是其他数据类型,尽量避免使用长字母数字字符串标识符?
谢谢!
答案 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;
这应该更快地返回结果,因为它不必在返回值之前首先计算窗口函数值(对于所有行)。