Лид и аналитические функции в BigQuery - PullRequest
0 голосов
/ 03 июля 2018

Предположим, моя таблица это

enter image description here

Я пытаюсь изменить свою таблицу этой информацией

enter image description here

Я добавил два столбца, в которых столбец WhenWasLastBasicSubjectDone сообщит вам, когда в каком семестре студент закончил свой последний базовый курс (отсортированный по семестру). В другом столбце TotalBasicSubjectsDoneTillNow объясняется, сколько раз студент до этого проходил базовый курс (предмет) (отсортировано по семестрам)?

Я думаю, что это легко решить с помощью объединений, а также с пользовательскими функциями, но я хочу использовать возможности существующих аналитических функций в BigQuery и решать их без объединений.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Ниже для BigQuery Standard 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
0 голосов
/ 03 июля 2018

Вы можете использовать оконные функции для этого - при условии, что у вас есть столбец, который определяет порядок. Позвольте мне предположить, что столбец 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...