按两个具有不同值的字段分组,然后按顺序选择特定的值

时间:2019-02-12 16:20:53

标签: sql google-bigquery

我一直在寻找解决这个问题的方法,但仍然找不到最类似于SQL Group BY COLUMN Choose specific rows的问题。

这是我的问题

     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,但这显然行不通。我需要的是按列1分组,对于列2中的每个不同值,如果它们各自的列1值均存在,则仅选择e;如果e不存在,则选择s;如果s不存在,则选择m。 感谢您的回答

2 个答案:

答案 0 :(得分:1)

一种方法使用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;

答案 1 :(得分:0)

下面是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