sql - BQ:从多列中选择最新日期
问题描述
大家好。我之前写了一个与此相关的问题,但现在我遇到了另一个问题。
我必须计算 install_time 和contributor_time 列之间的时间戳差异。但是,我有三个contributor_time 列,我需要先从这些列中选择最新时间,然后从安装时间中减去它。
样本数据
用户 | 安装时间 | 贡献者时间_1 | 贡献者时间_2 | 贡献者时间_3 |
---|---|---|---|---|
1 | 8:00 | 7:45 | 7:50 | 7:55 |
2 | 10:00 | 9:15 | 9:45 | 9:30 |
3 | 11:00 | 10:30 | 无效的 | 无效的 |
例如,在上表中,我需要选择contributor_time_3 并从用户1 的install_time 中减去它。对于用户2,我会这样做,但使用contributor_time_2。
样本结果
用户 | 安装时间 | time_diff_min |
---|---|---|
1 | 8:00 | 5 |
2 | 10:00 | 15 |
3 | 11:00 | 30 |
我面临的问题是 1)contributor_time 列是字符串格式,2)其中一些具有“空”字符串值(这意味着我不能将其转换为时间戳。)
我创建了一个查询,但我遇到了一个错误,指出我不能从时间戳中减去一个字符串。所以我添加了 safe_cast,但是 time_diff_min 结果仅在我将所有三个contributor_time 列作为时间戳时才显示。例如,在上面的示例表中,只有前两行会拉取。
我到目前为止的查询如下:
SELECT
users,
install_time,
TIMESTAMP_DIFF(install_time, greatest(contributor_time_1, contributor_time_2, contributor_time_3), MINUTE) as ctct_min
FROM
(SELECT
users,
install_time,
safe_cast(contributor_time_1 as timestamp) as contributor_time_1,
safe_cast(contributor_time_2 as timestamp) as contributor_time_2,
safe_cast(contributor_time_3 as timestamp) as contributor_time_3,
FROM
(SELECT
users,
install_time,
case when contributor_time_1 = 'null' then '0' else contributor_time_1 end as contributor_time_1,
....
FROM datasource
感谢您为我指明正确方向的任何帮助!先感谢您!
解决方案
您可以使用greatest()
:
select t.*,
time_diff(install_time, greatest(contributor_time_1, contributor_time_2, contributor_time_3), minute) as diff_min
from t;
注意:这假设值是 never NULL
,根据您的样本数据,这似乎是合理的。
推荐阅读
- wordpress - 如何通过编程创建 edd disocunt-code?
- unix - 如何使用 x 命令计算 sas 表中的行数
- c# - 以电子邮件正文格式发送 Excel 文件数据
- ruby - 如何使用 Rspec 模拟具有初始化方法的类?
- cts - 如何指明哪个 CTS 模块将对我们对 AOSP 的修改产生影响?
- java - Spring Boot 应用部署错误:“ServletException:无法实例化 WebApplicationInitializer 类”
- angular - 是否有内置的 Angular lostfocus 事件?
- python - 如何使用python找到最适合我的分布的概率密度函数曲线
- html - 在 Winjs 中从 HTML 内容生成 PDF
- android - 计算数据库实时数据时出现异常 - 迁移期间崩溃