Сгруппировать по двум полям с различным значением и выбрать конкретное значение по порядку - PullRequest
0 голосов
/ 12 февраля 2019

Я искал решение этой проблемы, но все еще не мог найти наиболее похожую проблему, чем эта SQL Group BY COLUMN Выберите конкретные строки .

Так вот моя проблема

     Type_Table
column1  |   column2
a        |   s
a        |   m
a        |   e
b        |   s
b        |   e
c        |   m
c        |   s 

так что в основном я хочу сгруппировать по column1, но выбирая только значения в column2 = e, но если его нет в дублированном значении в column1, тогда выберите column2 = s, но если это не таксуществует в дублированном значении column1, затем выберите column2 = m.Таким образом, итоговая таблица будет выглядеть так:

column1  |   column2
a        |   e
b        |   e
c        |   s 

Я использовал это select column1,case when column2=e then e when column2=s then s when column2=m then m end column2 from type_table group by 1, но, очевидно, это не сработает.Что мне нужно, так это сгруппировать по column1 и для каждого другого значения в column2 выберите только e, если существует для их соответствующего значения column1, но выберите s, если e не существует, и выберите m, если s не существует.Спасибо за ваши ответы

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Ниже представлен стиль BigQuery (со стандартным SQL)

#standardSQL
SELECT 
  column1, 
  ARRAY_AGG(column2 ORDER BY STRPOS('mse', column2) DESC LIMIT 1)[OFFSET(0)] column2
FROM `project.dataset.table`
GROUP BY column1

Вы можете протестировать, поиграть с выше, используя примеры данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'a' column1, 's' column2 UNION ALL
  SELECT 'a', 'm' UNION ALL
  SELECT 'a', 'e' UNION ALL
  SELECT 'b', 's' UNION ALL
  SELECT 'b', 'e' UNION ALL
  SELECT 'c', 'm' UNION ALL
  SELECT 'c', 's' 
)
SELECT 
  column1, 
  ARRAY_AGG(column2 ORDER BY STRPOS('mse', column2) DESC LIMIT 1)[OFFSET(0)] column2
FROM `project.dataset.table`
GROUP BY column1
-- ORDER BY column1 

с результатом

Row column1 column2  
1   a       e    
2   b       e    
3   c       s    
0 голосов
/ 12 февраля 2019

Один метод использует row_number():

select t.*
from (select t.*,
             row_number() over (partition by col1
                                order by (case col2 when 'e' then 1 when 's' then 2 when 'm' then 3 else 4 end)
                               ) as seqnum
      from t
     ) t
where seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...