[英](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.