如何从跨两个 DATE 列的 INNER JOIN 创建 MIN 和 MAX 日期列,其中每个 DATE 列来自单独的表 BigQuery

Posted

技术标签:

【中文标题】如何从跨两个 DATE 列的 INNER JOIN 创建 MIN 和 MAX 日期列,其中每个 DATE 列来自单独的表 BigQuery【英文标题】:How to create MIN and MAX date columns from an INNER JOIN across two DATE columns where each DATE column is from a separate table BigQuery 【发布时间】:2021-06-17 12:40:31 【问题描述】:

这是一个让我发疯的问题!

我想通过跨三个表的内部连接为每个唯一的 person_id 创建一个 MIN 列和一个 MAX 列,这些表具有两个单独的 DATE 列 - 一个在 tbl1 中,一个在 tbl2 中(表 3 只是基于 person_id 的连接)。我确定这只是我编写查询的顺序,但我不知道在哪里放置 tbl2 中的 DATE 列。

简而言之,无论 MIN 日期来自 tbl1 和 tbl2 的组合 DATE 列,都将形成 start_date,而无论 MAX 是什么,都将形成 end_date。两者都是日期,格式都是:YYYY-MM-DD,所以不用担心。

当我只想查找 tbl1 DATE 列的 MAX 和 MIN 日期时,这是一个示例查询:

SELECT  tbl1.person_id, MIN(tbl1.Date) AS start_date, MAX(tbl1.Date) AS end_date,
FROM `database_name.table_name1` tbl1
inner join `database_name.table_name2` tbl2
ON (
tbl1.person_id = tbl2.person_id
)
inner join `database_name.table_name3` tbl3
ON (
tbl1.person_id = tbl3.person_id    
)
GROUP BY tbl1.person_id

提前谢谢你

【问题讨论】:

【参考方案1】:

你似乎想要least()greatest()

SELECT tbl1.person_id,
       LEAST(MIN(tbl1.Date), MIN(tbl2.Date)) AS start_date,
       GREATEST(MAX(tbl1.Date), MAX(tbl2.Date)) AS end_date,
FROM `database_name.table_name1` tbl1 JOIN
     `database_name.table_name2` tbl2
     ON tbl1.person_id = tbl2.person_id JOIN
     `database_name.table_name3` tbl3
     ON tbl1.person_id = tbl3.person_id    
GROUP BY tbl1.person_id

【讨论】:

这太棒了,非常感谢您的快速响应 - 我花了很长时间才弄清楚这一点。如果我可以附加问题 - 如果我想从第一行的表中选择其他列 - 例如另一个标识符或与最小或最大日期关联的事件 - 我收到以下错误消息:SELECT list expression references Assmnt.AssessType 既不分组也不聚合 - 我应该将它们放在其他地方吗? @Raven52 。 . .这回答了您在此处提出的问题。如果您有不同的问题,请提出一个新问题。需要一个明确的解释。样本数据和期望的结果非常有帮助。 谢谢,会做的。

以上是关于如何从跨两个 DATE 列的 INNER JOIN 创建 MIN 和 MAX 日期列,其中每个 DATE 列来自单独的表 BigQuery的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个 SQL 表中获取两个不同列的匹配数据:Inner Join 和/或 Union?

IN SQL INNER JOIN 可以添加两个不同列的表吗?

两个 INNER JOIN 的 FULL OUTER JOIN

使用 INNER JOIN 重新创建查询? [复制]

MySQL内连接(INNER JOIN)

SQL中inner join,outer join和cross join的区别