簡體   English   中英

(SQL) 如何將每一行與 Presto 中的所有其他行進行比較

[英](SQL) How to compare each row to all other rows in Presto

我正在使用使用 Presto 的 AWS Athena。 假設我有一個 SQL 表,其中包含 A、B、C 和 D 列。假設表按列 C 排序,升序。

我需要將每一行與所有其他行進行比較,並檢查當前行的 D 值是否是 C 值小於當前行的 C 值的所有行中的最大值。 然后 append 列 F 中的 boolean 值。 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 筆記本會超時(數據集長達數百萬行),我認為通過本地 jupyter 實例連接到 AWS 會遇到類似問題。

在 SQL 中,您將使用 window 函數——如下所示:

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上離散地對行進行排序。 您可以在有序集之上使用 window 函數來實現您想要的結果:

SELECT 
     a,
     b,
     c,
     d,   
     CASE WHEN d>lag(max_so_far) OVER () THEN true ELSE false END as f
FROM (
    SELECT a,
        b,
        c,
        d,
        max(d) OVER (rows BETWEEN unbounded preceding AND current row) AS max_so_far
    FROM ( 
      -- sorted ON c 
      SELECT 
        a,
        b,
        c,
        d
      FROM dataset.table
      ORDER BY  c 
    ) 
 )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM