如何在标准 Bigquery 中使用 if-else 语句?

Posted

技术标签:

【中文标题】如何在标准 Bigquery 中使用 if-else 语句?【英文标题】:How to use if-else statement in Standard Bigquery? 【发布时间】:2019-12-11 04:03:07 【问题描述】:

如果我有如下表格:

|**Entry**-------**Name**--------**Date**------------------**Boolean**|    
|  1.-----------Car-----------2019-12-01----------True|  
|  2.-----------Car-----------2019-12-03----------False|  
|  3.-----------Bus-----------2019-12-05----------False|  
|  4.-----------Bus-----------2019-12-11----------False|

如果 Boolean 列为 true,或者如果布尔值为 false,则我想选择具有不同 Name 的行,或者如果布尔值为 false,则选择日期最早的行。所以对于 car 条目我想选择第一行,因为它的布尔值是真的(所以我可以忽略所有其他条目)和 bus 条目我想要选择最后一行,因为它的两个布尔值都是错误的,所以我想选择最早的日期(最接近当前日期)。

编辑:预期输出

| 1.-----------汽车------------2019-12-01----------真| | 4.-----------公交车------------2019-12-11----------假|

【问题讨论】:

请添加更多数据,例如您的当前输出和预期输出。 如果还有另一行用于 TRUE 的 Car - 您会选择哪一行? 您的查询分为两部分,因此您可以分别为这两种情况编写查询并将它们合并。因为使用“CASE WHEN ...THEN..”作为单个查询写入每一列对于读者和作者来说都更加复杂。 car 和 true 只能是一排。所以这就是为什么当我们读取一行时我们选择它。如果它不是真的,那么我们看看日期。 【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT AS VALUE ARRAY_AGG(t ORDER BY bool DESC, dt DESC LIMIT 1)[OFFSET(0)]
FROM `project.dataset.table` t
GROUP BY name

注意;这是基于您的评论中的“只有一排汽车和真实”...

如果应用到您的问题中的样本数据,如下例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'Car' name, '2019-12-01' dt, TRUE bool UNION ALL
  SELECT 'Car', '2019-12-03', FALSE UNION ALL
  SELECT 'Bus', '2019-12-05', FALSE UNION ALL
  SELECT 'Bus', '2019-12-11', FALSE 
)
SELECT AS VALUE ARRAY_AGG(t ORDER BY bool DESC, dt DESC LIMIT 1)[OFFSET(0)]
FROM `project.dataset.table` t
GROUP BY name   

结果是

Row name    dt          bool     
1   Car     2019-12-01  true     
2   Bus     2019-12-11  false    

【讨论】:

以上是关于如何在标准 Bigquery 中使用 if-else 语句?的主要内容,如果未能解决你的问题,请参考以下文章

如何在标准 Bigquery 中使用 if-else 语句?

如何在 BigQuery 标准 SQL 中查询 Bigtable 列值?

BigQuery 标准 SQL 如何将行转换为列

如何在 BigQuery 中使用标准 SQL 查询 GA RealtimeView?

在 Bigquery 中,如何使用标准 Sql 过滤 Struct 数组以匹配 Struct 中的多个字段?

如何在 BigQuery 标准 SQL 中将时间戳转换为秒