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

Мой входной набор данных:

ID  store_id    count           date_time
x   1             50            1/1/2017
x   2             20            1/2/2017
x   3             30            1/1/2018
y   1             70            1/1/2017
y   2             30            2/1/2018
z   1             100           1/1/2019

Выходной набор данных:

ID  store_id    count           date_time
x   3             30            1/1/2018
y   1             70            1/1/2017
z   1             100           1/1/2019

т. Е. Логика заключается в том, чтобы выбрать строку, в которой находится число. > = 60 для тех же идентификаторов, иначе получить строку для наибольшей даты и времени.

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Вот решение использовать аналитическую функцию

WITH Raw AS (
  select 'x' AS ID, 1 AS store_id, 50 AS count, '1/1/2017' AS date_time
  union all
  select 'x', 2, 20, '1/2/2017'
  union all
  select 'x', 3, 30, '1/1/2018'
  union all
  select 'y', 1, 70, '1/1/2017'
  union all
  select 'y', 2, 30, '2/1/2018'
  union all
  select 'z', 1, 100, '1/1/2019'
)
select
  *
FROM
  (select
    ID, store_id, count, date_time,
    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY PARSE_DATE('%d/%m/%Y', date_time) DESC) AS rowNum,
    MAX(count) OVER (PARTITION BY ID) AS maxCount
  FROM
    Raw)
WHERE
  (count >= 60)
OR
  (maxCount < 60 AND rowNum = 1)
0 голосов
/ 03 июля 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT AS value IF(arr_2[OFFSET(0)].cnt >= 60, arr_2[OFFSET(0)], arr_1[OFFSET(0)])
FROM (
  SELECT id,
    ARRAY_AGG(t ORDER BY PARSE_DATE('%d/%m/%Y', date_time) DESC LIMIT 1) arr_1,
    ARRAY_AGG(t ORDER BY cnt DESC LIMIT 1) arr_2
  FROM `project.dataset.table` t
  GROUP BY id
)

Примечание: я предполагаю, что формат ваших данных - дд / мм / гггг.Если это мм / дд / гггг - вы должны использовать «% m /% d /% Y» в PARSE_DATE () вместо

Если применить выше к фиктивным данным в вашем вопросе, как показано ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'x' id, 1 store_id, 50 cnt, '1/1/2017' date_time UNION ALL
  SELECT 'x', 2, 20, '1/2/2017' UNION ALL
  SELECT 'x', 3, 30, '1/1/2018' UNION ALL
  SELECT 'y', 1, 70, '1/1/2017' UNION ALL
  SELECT 'y', 2, 30, '2/1/2018' UNION ALL
  SELECT 'z', 1, 100, '1/1/2019' 
)
SELECT AS value IF(arr_2[OFFSET(0)].cnt >= 60, arr_2[OFFSET(0)], arr_1[OFFSET(0)])
FROM (
  SELECT id,
    ARRAY_AGG(t ORDER BY PARSE_DATE('%d/%m/%Y', date_time) DESC LIMIT 1) arr_1,
    ARRAY_AGG(t ORDER BY cnt DESC LIMIT 1) arr_2
  FROM `project.dataset.table` t
  GROUP BY id
)
ORDER BY id   

результат равен

Row id  store_id    cnt date_time    
1   x   3           30  1/1/2018     
2   y   1           70  1/1/2017     
3   z   1           100 1/1/2019     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...