微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

(SQL) 如何在 Presto 中将每一行与所有其他行进行比较

如何解决(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 举报,一经查实,本站将立刻删除。