sql - Presto SQL 窗口聚合回顾 x 小时/分钟/秒
问题描述
我想通过回顾 x 小时/分钟/秒前对 presto sql 进行聚合。
数据
id | timestamp | status
-------------------------------------------
A | 2018-01-01 03:00:00 | GOOD
A | 2018-01-01 04:00:00 | BAD
A | 2018-01-01 05:00:00 | GOOD
A | 2018-01-01 09:00:00 | BAD
A | 2018-01-01 09:15:00 | BAD
A | 2018-01-01 13:00:00 | GOOD
A | 2018-01-01 14:00:00 | GOOD
B | 2018-02-01 09:00:00 | GOOD
B | 2018-02-01 10:00:00 | BAD
结果:
id | timestamp | status | bad_status_count
----------------------------------------------------------------
A | 2018-01-01 03:00:00 | GOOD | 0
A | 2018-01-01 04:00:00 | BAD | 1
A | 2018-01-01 05:00:00 | GOOD | 1
A | 2018-01-01 09:00:00 | BAD | 1
A | 2018-01-01 09:15:00 | BAD | 2
A | 2018-01-01 13:00:00 | GOOD | 0
A | 2018-01-01 14:00:00 | GOOD | 0
B | 2018-02-01 09:00:00 | GOOD | 0
B | 2018-02-01 10:00:00 | BAD | 1
我按业务计算过去 3 小时内的不良状态。我怎样才能做到这一点?我正在尝试这样的事情:
SELECT
id,
timestamp,
status
count(status) over(partition by id order by timestamp range between interval '3' hour and current_row) as bad_status_count
from table
当然它还不起作用,我仍然必须过滤掉不良状态。我收到了这个错误:
Error running query: line 7:1: Window frame start value type must be INTEGER or BIGINT(actual interval day to second)
解决方案
我不是 100% 如何在 PrestoDB 中表达这一点,但关键思想是将时间戳转换为小时:
select t.*,
sum(case when status = 'Bad' then 1 else 0 end) over
(partition by id
order by hours
range between -3 and current row
) as bad_status
from (select t.*,
date_diff(hour, '2000-01-01', timestamp) as hours
from t
) t;
推荐阅读
- regex - 从其中一个字段中有换行符的 URL 导入 CSV
- python - 如何从该列表中获取最后一列?
- html - SVG 在 Firefox 中完全不可见
- ruby - 如何使用字符串插值标识符关闭 Ruby Heredoc
- python - uipath无法读取python脚本
- java - 尽管日志中的占位符图像和 URL 都有效,但 Glide 没有从 URL 加载图像
- python - cv2.VideoWriter 在 Jetson Nano 上无法正常工作
- sql - Oracle DDL 触发器错误 - RDSADMIN.RDS_DDL_TRIGGER
- regex - 列表中的 Pandas 数据框通配符值
- javascript - 如何使用 ajax 和 php 填充表格并在表格行中添加按钮?