在 BigQuery 中使用 Where 子句进行切片

Slicing with Where clause in BigQuery

我的查询有问题,试图计算术语和会话之间的分数变化,每次我尝试按会话切片时,如下面的查询所示,更改列 returns 'null' 在所有行中,但如果我确实删除了会话切片,则更改列 returns 所需的值。

ca table

name  id  subject session   term classroom ca_cat  score
one   1    maths  2018/2019   1    level1    1       10
one   1    maths  2018/2019   1    level1    2       6
two   2    maths  2018/2019   1    level1    1       9
two   2    maths  2018/2019   1    level1    2       7
one   1    maths  2018/2019   2    level1    1       9
one   1    maths  2018/2019   2    level1    2       8
two   2    maths  2018/2019   2    level1    1       7
two   2    maths  2018/2019   2    level1    2       5        

考试table

name    id    course session   term classroom    score
one     1      maths 2018/2019   1    level1      50
two     2      maths 2018/2019   1    level1      49 
one     1      maths 2018/2019   2    level1      50
two     2      maths 2018/2019   2    level1      50  

查询

select
    studentid,
    name,
    subject,
    classroom,
    session,
    term,
    round(avg_score,0) as average_score,
    round(avg_score -  lag(avg_score, 1) over(partition by name, subject order by session) / 100*100, 0) as change,
from (
    select studentid, name, subject, classroom, session, term, avg(totalscore) over(partition by name, classroom, session, term) avg_score
    from (
    SELECT name, studentid, subject, classroom, session, term, caone, catwo, exam,
  caone + catwo + exam AS totalscore
FROM (
  SELECT name, studentid, subject, classroom, session, term, 
    MAX(IF(cacount = 1, ca.score, NULL)) AS caone,
    MAX(IF(cacount = 2, ca.score, NULL)) AS catwo,
    ANY_VALUE(ex.score) AS exam
  FROM `exam` ex
  JOIN `catable` ca
  USING (name, studentid, subject, classroom, session, term) 
  GROUP BY name, studentid, subject, classroom, session, term
)  
    ))
    where studentid=1 and session='2018/2019' and term=2
group by studentid, name, subject, classroom, session,term, avg_score

我想要的预期输出是这样的

name, id, subject, classroom, session,    term, totalscore change
one    1    math    level1     2018/2019   1        66       null
one    1    math    level1     2018/2019   2        67        1 
two    2    math    level1     2018/2019   1        65       null
two    2    math    level1     2018/2019   2        62       -3 

分数的变化是术语之间的差异,例如 2nd-1st 和 3rd-2nd

是否有解决方法?我已经尝试了我所知道的一切,似乎无法找到它为什么以这种方式响应或可能是什么问题。

以下适用于 BigQuery 标准 SQL

#standardSQL
SELECT *, 
  totalscore - LAG(totalscore) OVER(PARTITION BY name, id, subject, classroom, session ORDER BY term) AS change
FROM (
  SELECT name, id, subject, classroom, session, term, caone + catwo + exam AS totalscore
  FROM (
    SELECT name, id, subject, classroom, session, term, 
      MAX(IF(ca_cat = 1, ca.score, NULL)) AS caone,
      MAX(IF(ca_cat = 2, ca.score, NULL)) AS catwo,
      ANY_VALUE(ex.score) AS exam,
    FROM `project.dataset.exam` ex
    JOIN `project.dataset.catable` ca
    USING (name, id, subject, classroom, session, term) 
    GROUP BY name, id, subject, classroom, session, term 
  )
)
-- ORDER BY name, id, subject, classroom, session, term   

当应用于您问题中的示例数据时 - 结果是

Row name    id  subject classroom   session     term    totalscore  change   
1   one     1   maths   level1      2018/2019   1       66          null     
2   one     1   maths   level1      2018/2019   2       67          1    
3   two     2   maths   level1      2018/2019   1       65          null     
4   two     2   maths   level1      2018/2019   2       62          -3