sql - 在 hive/sql 中使用延迟函数时列中的默认值
问题描述
我有一张像下面这样的表格Hive
。
我想计算相同列的时间差并seconds
获取列中id
的值time_diff
。
Table
+-----+---------+------------------------+
| id | event | eventdate |
+-----+---------+------------------------+
| 1 | sent | 2017-11-23 03:49:50.0 |
| 1 | sent | 2017-11-23 03:49:59.0 |
| 2 | sent | 2017-11-23 04:49:59.0 |
| 1 | click | 2017-11-24 03:49:50.0 |
+-----+---------+------------------------+
我做了如下
SELECT *, coalesce(unix_timestamp(eventdate) - unix_timestamp(LAG(eventdate) OVER(PARTITION BY ID ORDER BY eventdate)),0) time_diff FROM Table;
Result
+-----+---------+------------------------+-----------+
| id | event | eventdate |time_diff |
+-----+---------+------------------------+-----------+
| 1 | sent | 2017-11-23 03:49:50.0 | 0 |
| 1 | sent | 2017-11-23 03:49:59.0 | 9 |
| 2 | sent | 2017-11-23 04:49:59.0 | 0 |
| 1 | click | 2017-11-24 03:49:50.0 | 86391 |
+-----+---------+------------------------+-----------+
我得到了我想要的,但有一个小例外。结果 where id
is1
和event
issent
在time_diff
列中有两个值0
和9
。在我们应用滞后函数后,我希望所有sent
事件都包含0
在列中。time_diff
Expected result
:
+-----+---------+------------------------+-----------+
| id | event | eventdate |time_diff |
+-----+---------+------------------------+-----------+
| 1 | sent | 2017-11-23 03:49:50.0 | 0 |
| 1 | sent | 2017-11-23 03:49:59.0 | 0 |
| 2 | sent | 2017-11-23 04:49:59.0 | 0 |
| 1 | click | 2017-11-24 03:49:50.0 | 86391 |
+-----+---------+------------------------+-----------+
我怎样才能得到预期的结果?
解决方案
您可以使用case
表达式:
SELECT *,
(case when event = 'sent' then 0
else coalesce(unix_timestamp(eventdate) - unix_timestamp(LAG(eventdate) OVER(PARTITION BY ID ORDER BY eventdate)), 0)
end) as time_diff
FROM Table;
推荐阅读
- javascript - 数组有 5 个对象,每个对象都有另外 5 个对象的数组属性。我正在尝试创建查找具有 ID 的对象的函数
- python - 运行 python 脚本的 subprocess.Popen() 未显示 input() 提示
- javascript - 如何修复:TypeError:无法在我的代码上读取 null 的属性“加入”?
- c# - 在 ASP.NET 中的 while 循环内延迟操作(异步)
- node.js - 如何在谷歌助手丰富的响应中创建动态列表?
- html - 使用 requests.get/urllibopen 检索 Intranet 网站内容不起作用
- typo3 - 对 DDEV TYPO3 实例的整理
- cpu-registers - XBee-Pro S1 串行通讯不工作
- sql - SQL 连接字符串的连接错误
- java - 在 RecyclerView 中运行由帧制作的动画