我有一张如下所示的表格
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)进行计算。
答案 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_answer
为 NULL
,因此 max()
有效(假设每个会话有一个正确答案行)。