При агрегировании строк в bigquery я хочу расставлять приоритеты по определенным ключевым словам и извлекать разные столбцы

# #sql #google-bigquery

Вопрос:

Я хотел бы объединить эту таблицу по идентификатору, как показано ниже. Приоритеты-золото, серебро, бронза, в таком порядке, со ссылкой на «столбец типа».

приоритеты: золото > серебро >> бронза

до

ID Тип текст
1 Золото банан
1 серебро Apple
2 серебро Оранжевый
2 бронза авокадо
3 Золото киви
3 бронза черника

после

ID текст
1 банан
2 Оранжевый
3 киви

Ответ №1:

Попробуй array_agg :

 select id, array_agg(text order by length(type) limit 1)[offset(0)] as text
from mytable
group by id
 

Ответ №2:

Рассмотрим ниже

 select id, 
  array_agg(text order by strpos(',bronze,silver,gold,', ',' || type || ',') desc limit 1)[offset(0)] as text
from `project.dataset.table`
group by id
 

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

введите описание изображения здесь

Другой способ-это

 select id, text 
from `project.dataset.table`
where true
qualify row_number() over(partition by id order by strpos(',bronze,silver,gold,', ',' || type || ',') desc) = 1
 

с тем же выходом

Комментарии:

1. Скорее всего, так оно и есть strpos('gold,silver,bronze', type) .

2. конечно! Спасибо, что проверили @SergeyGeron !