Получите среднее значение 3 наибольшего значения в массиве Bigquery - PullRequest
0 голосов
/ 13 мая 2019

Предположим, у меня есть эта таблица с именем table1 в Bigquery, где x и y - массив, как я могу получить среднее значение 3 самых больших x и y для каждого времени? Спасибо!

Таблица 1:

Time                           x                     y
00:01:00                     -1.05                  1.23
                             1.456                  2.432
                             1.890                  1.456
                             -0.345                 1.356
                             1.2345                 0.9853
                             1.2344                 0.9857
00:02:00                     2.124                  1.3564
                             1.345                  2.4542
                             -0.9823                3.2343
                             1.231                  1.3453

Желаемая:

Time                    avg_x                                  avg_y
00:01:00              (Average of 3 greatest x at 00:01:00)  (Average of 3 greatest x at 00:01:00)
00:02:00              (Average of 3 greatest x at 00:02:00)  (Average of 3 greatest x at 00:02:00)

1 Ответ

1 голос
/ 13 мая 2019

Ниже для BigQuery Standard SQL

#standardSQL
CREATE TEMP FUNCTION avg_array(arr ANY TYPE) AS ((
  SELECT AVG(val) FROM(
    SELECT val FROM UNNEST(arr) val ORDER BY val DESC LIMIT 3)
  )
);
SELECT time, 
  avg_array(x) avg_x,
  avg_array(y) avg_y
FROM `project.dataset.table`   

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

Row time        avg_x               avg_y    
1   00:01:00    1.5268333333333333  1.748    
2   00:02:00    1.5666666666666669  2.3483     

Более общая версия (ниже) позволяет вам передать, сколько топовых элементов на счет

#standardSQL
CREATE TEMP FUNCTION avg_array(arr ANY TYPE, cnt INT64) AS ((
  SELECT AVG(val) FROM(
    SELECT val, ROW_NUMBER() OVER(ORDER BY val DESC) pos FROM UNNEST(arr) val
  )
  WHERE pos <= cnt
));
SELECT time, 
  avg_array(x, 3) avg_x,
  avg_array(y, 3) avg_y
FROM `project.dataset.table`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...