【问题标题】:Combine row aggregate data with individual rows将行聚合数据与单个行合并
【发布时间】:2021-08-07 09:40:11
【问题描述】:

我有一张如下所示的表格

base_data

session_id event_type player_guess correct_answer
1 guess 'python' NULL
1 guess 'javascript' NULL
1 guess 'scala' NULL
1 all_answered NULL ['python','javascript','hadoop']
2 guess 'triangle' NULL
2 guess 'square' NULL
2 all_answered NULL ['triangle','square']

我正在尝试获取一个名为 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 event_type player_guess correct_answer was_guess_correct
1 guess 'python' NULL 1
1 guess 'javascript' NULL 1
1 guess 'scala' NULL 0
1 all_answered NULL ['python','javascript','hadoop'] 1
2 guess 'triangle' NULL 1
2 guess 'square' NULL 1
2 all_answered NULL ['triangle','square'] 1

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

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

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

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

【问题讨论】:

    标签: sql amazon-athena presto


    【解决方案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() 有效(假设每个会话有一个正确答案行)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      • 2015-08-12
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多