GroupBy +条件

时间:2018-05-02 23:46:43

标签: sql google-bigquery sql-standards

如果我有一张像

这样的表格
ID | Start  | End    | Name | Code
1  | 1000   | 1001   | ABC1 |  A
1  | 1000   | 1001   | FSD1 |  B
2  | 1200   | 1201   | CC12 |  A
3  | 4000   | 4002   | GF41 |  B
3  | 4000   | 4002   | ML65 |  A     

使用SQL Standard,我们可以编写以下条件:

如果是(ID,开始,结束),代码是A和B,那么只打印 记录w / B.否则,打印记录。这是输出:

ID | Start  | End    | Name | Code
1  | 1000   | 1001   | FSD1 |  B
2  | 1200   | 1201   | CC12 |  A
3  | 4000   | 4002   | GF41 |  B

谢谢!

2 个答案:

答案 0 :(得分:2)

以下是BigQuery Standrad SQL

   
<dirent.h>

结果应该是

#standardSQL
WITH `project.dataset.your_table`  AS (
  SELECT 1 id, 1000 start, 1001 `end`, 'ABC1' name, 'A' code UNION ALL
  SELECT 1, 1000, 1001, 'FSD1', 'B' UNION ALL
  SELECT 2, 1200, 1201, 'CC12', 'A' UNION ALL
  SELECT 3, 4000, 4002, 'GF41', 'B' UNION ALL
  SELECT 3, 4000, 4002, 'ML65', 'A' 
)
SELECT 
  id, start, `end`, 
  ARRAY_AGG(STRUCT(name, code) ORDER BY code DESC LIMIT 1)[OFFSET(0)].*
FROM `project.dataset.your_table`
GROUP BY id, start, `end` 
-- ORDER BY id

具有相同结果的替代选项,但如果您的表中有更多/其他字段需要包含在输出中,则可能很有用

Row id  start   end     name    code     
1   1   1000    1001    FSD1    B    
2   2   1200    1201    CC12    A    
3   3   4000    4002    GF41    B     

答案 1 :(得分:1)

您可以使用row_number()

执行此操作
select t.*
from (select t.*,
             row_number() over (partition by id order by code desc) as seqnum
      from t
     ) t
where seqnum = 1;

这种方法优于聚合方法的优点是它可以轻松地包含所有列,而不会产生聚合开销。