0

如果我有一张像

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 标准,我们可以编写以下 if 条件:

如果对于(ID,开始,结束),代码是 A 和 B,则只打印带有 B 的记录。否则,打印记录。这是输出:

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

谢谢!

4

2 回答 2

2

以下是 BigQuery Standrad SQL

#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     

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

#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 row.*
FROM (
  SELECT ARRAY_AGG(t ORDER BY code DESC LIMIT 1)[OFFSET(0)] row
  FROM `project.dataset.your_table` t
  GROUP BY id, start, `end` 
)
-- ORDER BY id
于 2018-05-02T23:56:09.053 回答
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;

这种方法相对于聚合方法的优势在于它很容易包含所有列,而没有聚合的开销。

于 2018-05-03T00:14:31.177 回答