Фильтр BigQuery ГДЕ по дате за последние 5 строк для каждого значения категориального столбца - PullRequest
0 голосов
/ 30 октября 2019

Извинения, если заголовок немного многословный - ниже я создам пример, чтобы выделить то, на что я ссылаюсь. У меня есть следующая таблица информации:

t1

date        team    num_val
2017-10-04    ab          7  
2017-10-03    ab          6
2017-10-02    ab          8
2017-10-05    ab          3
2017-10-07    ab         12
2017-10-06    ab          3
2017-10-01    ab          5
2017-09-08    cd          4
2017-09-09    cd          8
2017-09-10    cd          2
2017-09-14    cd          1
2017-09-13    cd          5
2017-09-11    cd          6
2017-09-12    cd         13

С этой таблицей я бы просто хотел:

  • Фильтр для каждой команды, последние 5 дат
  • Группировка по команде и суммирование столбца num_val

Достаточно просто. Тем не менее, нет никаких рифм или причин для дат для каждой команды (я не могу просто отфильтровать последние 5 дат в целом, так как они могут отличаться для каждой команды). В настоящее время у меня есть следующая структура для запроса:

SELECT
  team, 
  sum(num_val)
FROM t1
GROUP BY team

... любая помощь в получении этого до финиша будет принята с благодарностью, спасибо !!

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Несколько дополнительных опций для BigQuery Standard SQL, поэтому вы видите разные подходы

Опция # 1

#standardSQL
SELECT team, SUM(num_val) sum_num FROM (
  SELECT team, num_val, ROW_NUMBER() OVER(PARTITION BY team ORDER BY DATE DESC) pos
  FROM `project.dataset.table`
)
WHERE pos <= 5
GROUP BY team

Опция # 2

#standardSQL
SELECT team, sum_num FROM (
  SELECT team, 
    SUM(num_val) OVER(PARTITION BY team ORDER BY DATE DESC ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) AS sum_num, 
    ROW_NUMBER() OVER(PARTITION BY team ORDER BY DATE DESC) pos
  FROM `project.dataset.table`
)
WHERE pos = 1  

Если применить к образцу данных по вашему вопросу - оба результата приведут к следующему результату

Row team    sum_num  
1   ab      31   
2   cd      27     

Хотя вышеуказанные параметры могут быть полезны в некоторых более сложных случаях - в вашем конкретном случае - я быперейти с вариантом (похожим на один), представленным в ответе Филипе

#standardSQL
SELECT team, (SELECT SUM(num_val) FROM UNNEST(num_values)) sum_num
FROM (
  SELECT team, ARRAY_AGG(STRUCT(num_val) ORDER BY DATE DESC LIMIT 5) num_values
  FROM `project.dataset.table`
  GROUP BY team
)
1 голос
/ 30 октября 2019

Чтобы получить последние 5 для каждого:

SELECT team, ARRAY_AGG(num_val ORDER BY date DESC LIMIT 5) arr
FROM x
GROUP BY team

Затем UNNEST(arr) и добавьте эти num_vals.

SELECT team, (SELECT SUM(num_val) FROM UNNEST(arr) num_val) the_sum
FROM (previous)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...