UNNEST 数组并使用 CASE WHEN 分配给新列

Posted

技术标签:

【中文标题】UNNEST 数组并使用 CASE WHEN 分配给新列【英文标题】:UNNEST array and assign to new columns with CASE WHEN 【发布时间】:2020-05-12 09:00:04 【问题描述】:

我有以下 BigQuery 表,它具有嵌套结构,即下面的示例是我表中的一条记录。

标识 |日期 |时间 |代码

AQ5ME | 120520 | 0950 | 123

--------- | 150520 | 1530 | 456

我的目标是取消嵌套数组以实现以下结构(假设 123 是开始日期代码,456 是结束日期代码):

标识 |开始日期 |开始时间 |结束日期 |结束时间

AQ5ME | 120520 | 0950 | 150520 | 1530

我在 BigQuery 中尝试了基本的 UNNEST,结果如下:

标识 |开始日期 |开始时间 |结束日期 |结束时间

AQ5ME | 120520 | 0950 |空 |空

AQ5ME |空 |空 | 150520 |第1530章

您能否支持我如何以上述正确方式取消嵌套?

【问题讨论】:

您应该只按 ID 分组,并对其他列使用聚合函数,例如 any_value、min、max 【参考方案1】:

您可以计算行内的最小值和最大值,并将它们提取为新列。 由于您没有显示完整的架构,我假设 Date 和 Time 是单独的数组。 对于这种情况,您可以使用该查询:

SELECT Id, 
    (SELECT MIN(D) from UNNEST(Date) as d) as StartDate, 
    (SELECT MIN(t) from UNNEST(Time) as t) as StartTime, 
    (SELECT MAX(D) from UNNEST(Date) as d) as EndDate, 
    (SELECT MAX(t) from UNNEST(Time) as t) as EndTime
FROM table

【讨论】:

感谢 Sabri 的回答,它帮助很大,这正是我所需要的,非常感谢。后续问题 - 使用您的代码设置视图后,所有字段都被视为重复整数,不能在 ORDER BY 部分中使用。你知道为什么这个字段是重复的,因为我们使用了聚合函数并且从所有未嵌套的值中只选择了一个值吗? 你能展示你的示例查询吗?如果您为 ex 添加:ORDER BY StartDate, StartTime,它应该可以工作。 当然,所以在我的示例中,它看起来类似于以下情况:SELECT Id, (SELECT MIN(D) from UNNEST(Date) as d) as StartDate FROM table ORDER BY StartDate DESC 我的情况更复杂。我的 StartDate 原始字段假设为具有三个后代的 ScheduledDate:时间、日期和索引。作为第一步,我做了:ARRAY(SELECT date FROM UNNEST(ScheduledDate)) 然后我继续使用您的答案中的 MIN 和 MAX。 我还是想看看原始样本数据给出更好的答案。【参考方案2】:

正如 Sabri 的回应 - 在取消嵌套时使用聚合函数非常有效。稍后要将此字段用于排序目的(在 ORDER BY 语句中),可以使用 SAFE_OFFSET[0],如下所示:

...
ORDER BY StartDate[SAFE_OFFSET(0)] ASC

【讨论】:

以上是关于UNNEST 数组并使用 CASE WHEN 分配给新列的主要内容,如果未能解决你的问题,请参考以下文章

mysql 查询某个字段并拼接case when出来的字段

SQL语句中case,when,then的用法

总结大量 CASE WHEN 的最佳方式

在 SQL Server 中结合 dbplyr 和 case_when

oracle sql - 选择具有多个“case when”的语句并检查是不是包含文本

case when 使用