将行聚合数据与单个行合并

时间:2021-05-18 06:56:04

标签: sql amazon-athena presto

我有一张如下所示的表格

base_data

<头>
session_id 事件类型 player_guess 正确答案
1 猜测 '蟒蛇' NULL
1 猜测 'javascript' NULL
1 猜测 'scala' NULL
1 all_answered NULL ['python','javascript','hadoop']
2 猜测 '三角形' NULL
2 猜测 '正方形' NULL
2 all_answered NULL ['三角形','正方形']

我正在尝试获取一个名为 was_guess_correct 的新列,定义如下:

For each session_id, match the player_guess values with data in correct_answer. Correct answer for session_id is available when event_type = 'all_answered'

结果看起来像 -

<头>
session_id 事件类型 player_guess 正确答案 was_guess_correct
1 猜测 '蟒蛇' NULL 1
1 猜测 'javascript' NULL 1
1 猜测 'scala' NULL 0
1 all_answered NULL ['python','javascript','hadoop'] 1
2 猜测 '三角形' NULL 1
2 猜测 '正方形' NULL 1
2 all_answered NULL ['三角形','正方形'] 1

all_answered 行中的值是唯一且已排序的(可以使用顺序或仅使用 IN 子句检查也可以)

对于 event_type all_answered 的行,列 was_guess_correct 无关紧要。它可以是 1 或 0 - 任何有助于使查询更容易的东西。

如何在 SQL/Presto 中计算上述列?

我想看看 - 如果可能的话,如何使用 JOIN/Unnest 和内联(没有 JOIN)进行计算。

1 个答案:

答案 0 :(得分:1)

您可以使用窗口函数来获得每一行的正确答案。那么您如何管理结果取决于列的类型。如果是字符串,则可以使用 like:

select t.*,
       (case when event_type = 'all_answered' or
                  max(correct_answer) over (partition by session_id) like  '%''' || player_guess || '''%'
             then 1 else 0 
        end) as was_guess_correct
from t;

请注意,“猜测”行中的 correct_answerNULL,因此 max() 有效(假设每个会话有一个正确答案行)。