Bigquery: выберите топ 3 с условием группировки по - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть такая таблица

type    Total
 A       100
 A       123
 A       154
 A       50
 A       54
 B       200
 B       166
 B       423
 B       342
 B       213
 C       520
 C       130
 C       234
 C       512

Я хочу выбрать 3 лучших итога по группам.Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Номер строки в порядке.Интересный способ сделать это в BigQuery:

select type,
       array_agg(total order by total desc limit 3) as top3
from t
group by type;

Это помещает значения в массив.

0 голосов
/ 06 декабря 2018

В большинстве случаев использования [больших данных] использование ROW_NUMBER () не подходит, так как заканчивается ошибкой превышения ресурса.Это связано с тем, что требуется, чтобы все точки одной и той же группы присутствовали в одном и том же / одном узле, что в случае перекоса данных приводит к вышеупомянутой ошибке в BigQuery

Опция 1

Одним из обычных способов решения этой проблемы является использование функции ARRAY_AGG (), как показано ниже в следующем примере

#standardSQL
SELECT type, total FROM (
  SELECT type, ARRAY_AGG(total ORDER BY total DESC LIMIT 3) arr
  FROM `project.dataset.table` GROUP BY type
), UNNEST(arr) total

Если выполнить выше пример данных из вашего вопроса

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'A' type, 100 total UNION ALL
  SELECT 'A', 123 UNION ALL
  SELECT 'A', 154 UNION ALL
  SELECT 'A', 50 UNION ALL
  SELECT 'A', 54 UNION ALL
  SELECT 'B', 200 UNION ALL
  SELECT 'B', 166 UNION ALL
  SELECT 'B', 423 UNION ALL
  SELECT 'B', 342 UNION ALL
  SELECT 'B', 213 UNION ALL
  SELECT 'C', 520 UNION ALL
  SELECT 'C', 130 UNION ALL
  SELECT 'C', 234 UNION ALL
  SELECT 'C', 512 
)
SELECT type, total FROM (
  SELECT type, ARRAY_AGG(total ORDER BY total DESC LIMIT 3) arr
  FROM `project.dataset.table` GROUP BY type
), UNNEST(arr) total
-- ORDER BY type   

Вы получите ожидаемый результат в виде

Row type    total    
1   A       154  
2   A       123  
3   A       100  
4   B       423  
5   B       342  
6   B       213  
7   C       520  
8   C       512  
9   C       234    

Вариант 2

Но есть еще один интересный вариант для действительно больших данных - использовать функцию APPROX_TOP_SUM () какв приведенном ниже примере

#standardSQL
SELECT type, value AS total FROM (
  SELECT type, APPROX_TOP_SUM(total, total, 3) arr
  FROM `project.dataset.table` GROUP BY type
), UNNEST(arr)  

, очевидно, с тем же выводом, что и выше для данных выборки

0 голосов
/ 06 декабря 2018

Вы можете попробовать использовать row_number ()

select * from
(
select type, total, row_number() over(partition by type order by total desc) as rn
from tablename
)A
where rn<=3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...