代码之家  ›  专栏  ›  技术社区  ›  phaigeim

BigQuery中的领导和分析功能

  •  2
  • phaigeim  · 技术社区  · 6 年前

    假设我的桌子是这个

    我正试图用这个信息修改我的表

    我添加了两列,其中column whenwaslastbasicsubjectdone 将告诉您学生在哪个学期完成了最新的基础课程(按学期排序)。另一列 totalbasicSubjectsDonetillNow 说明学生到目前为止完成基础课程(主题)的次数(按学期排序)?

    我认为使用联接和UDF很容易解决这一问题,但我希望使用bigquery中现有分析函数的强大功能,并在不使用联接的情况下解决它。

    我正试图用这个信息修改我的表

    enter image description here

    我添加了两列,其中列 WhenWasLastBasicSubjectDone 会让你知道学生在哪个学期完成了最新的基础课程(按学期排序)。另一列 TotalBasicSubjectsDoneTillNow 解释到目前为止学生完成基础课程(科目)的次数(按学期排序)?

    我认为使用连接和UDF都很容易解决这个问题,但是我想在BigQuery中使用现有分析函数的强大功能,并在不使用连接的情况下解决它。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    您可以为此使用窗口函数——假设您有一个指定排序的列。我假设这个专栏是 semester :

    select t.*,
           max( case when subject = 'Basic' then semester end ) over (partition by student order by semester end) as lastbasic,
           sum( case when subject = 'Basic' then 1 else 0 end ) over (partition by student order by semester end) as numbasictillnow    
    from t
    
        2
  •  1
  •   Mikhail Berlyant    6 年前

    以下是BigQuery标准SQL

    #standardSQL
    SELECT *,
      LAST_VALUE(IF(subject='Basic',semester,NULL) IGNORE NULLS) OVER(win) AS WhenWasLastBasicSubjectDone ,
      COUNTIF(subject='Basic') OVER(win) AS TotalBasicSubjectsDoneTillNow     
    FROM `project.dataset.table`
    WINDOW win AS (PARTITION BY student ORDER BY semester)
    

    您可以使用下面问题中的虚拟数据进行测试、玩上面的游戏

    #standardSQL
    WITH `project.dataset.table` AS (
      SELECT 1 Student, 'Sub1' Subject, 'Sem1' Semester UNION ALL
      SELECT 1, 'Sub2', 'Sem2' UNION ALL
      SELECT 1, 'Basic', 'Sem3' UNION ALL
      SELECT 1, 'Basic', 'Sem4' UNION ALL
      SELECT 1, 'Sub3', 'Sem5' UNION ALL
      SELECT 1, 'Sub2', 'Sem6' UNION ALL
      SELECT 1, 'Sub3', 'Sem7' UNION ALL
      SELECT 1, 'Sub4', 'Sem8' 
    )
    SELECT *,
      LAST_VALUE(IF(subject='Basic',semester,NULL) IGNORE NULLS) OVER(win) AS WhenWasLastBasicSubjectDone ,
      COUNTIF(subject='Basic') OVER(win) AS TotalBasicSubjectsDoneTillNow     
    FROM `project.dataset.table`
    WINDOW win AS (PARTITION BY student ORDER BY semester)
    -- ORDER BY Semester