如何解决(SQL) 如何在 Presto 中将每一行与所有其他行进行比较
我正在与使用 Presto 的 AWS Athena 合作。假设我有一个包含 A、B、C 和 D 列的 sql 表。假设表按 C 列升序排序。
我需要将每一行与所有其他行进行比较,并检查当前行的 D 值是否是 C 值小于当前行的 C 值的所有行中的最大值。然后在 F 列中附加一个布尔值。 Python 中的代码如下所示:
D_val_list = []
for index,row in df.iterrows():
max_val_D = df[:index]['D'].max() #Sorted on column C
if row['D'] < max_val_D:
D_val_list.append(FALSE)
else:
D_val_list.append(TRUE)
df['F'] = D_val_list
在 Athena 中使用临时 jupyter notebook 超时(数据集有数百万行),我认为通过本地 jupyter 实例连接到 AWS 会出现类似问题。
解决方法
在 SQL 中,你会使用窗口函数——像这样:
select t.*,(case when d < coalesce(max(d) over (order by c
rows between unbounded preceding and 1 preceding) is null,d + 1
then 1 else 0
end) as flag
from t;
假设 c
是唯一的,此逻辑将起作用。也就是说,根据数据的确切性质,可能还有其他选择。
由于其分布式特性,您必须在 Athena 中对 c
上的行进行离散排序。您可以在有序集之上使用窗口函数来实现您想要的结果:
SELECT
a,b,c,d,CASE WHEN d>lag(max_so_far) OVER () THEN true ELSE false END as f
FROM (
SELECT a,max(d) OVER (rows BETWEEN unbounded preceding AND current row) AS max_so_far
FROM (
-- sorted ON c
SELECT
a,d
FROM dataset.table
ORDER BY c
)
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。