如何解决如何将前 7 天的数据显示为今天行中的一列?
我有这样的数据:
日期 | 错误 | 销售 |
---|---|---|
7/1 | 1 | 10 |
7/2 | 2 | 12 |
7/3 | 3 | 15 |
7/4 | 4 | 20 |
7/5 | 5 | 21 |
7/6 | 6 | 24 |
7/7 | 7 | 27 |
7/8 | 8 | 30 |
我想展示前 7 个日期的错误和销售数据作为每一天的列。所以它会像:
日期 | 错误 | 销售 | 错误 1 | Sales-1 | 错误 2 | Sales-2 | 错误 3 | Sales-3 | ... |
---|---|---|---|---|---|---|---|---|---|
7/1 | 1 | 10 | ... | ||||||
7/2 | 2 | 12 | 1 | 10 | ... | ||||
7/3 | 3 | 15 | 2 | 12 | 1 | 10 | ... | ||
7/4 | 4 | 20 | 3 | 15 | 2 | 12 | 1 | 10 | ... |
7/5 | 5 | 21 | 4 | 20 | 3 | 15 | 2 | 12 | ... |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
因此,Error-1 表示昨天的错误,Error-2 表示前 2 天的错误,Error-3 表示前 3 天的错误,依此类推
我目前的解决方案是保持自加入 7 次:
t1.date = t2.date - 1day
t1.date = t2.date - 2day
t1.date = t2.date - 3day...
但显然这是一个非常丑陋的方法,并且查询时间很长。有没有更快的方法来做到这一点?
解决方法
假设您在表中有每天的数据(如您的样本数据),只需使用 lag()
:
select date,error,sale,lag(error,1) over (order by date) as prev1_error,lag(sale,1) over (order by date) as prev1_sale,2) over (order by date) as prev2_error,2) over (order by date) as prev2_sale,3) over (order by date) as prev3_error,3) over (order by date) as prev3_sale,. . .
from t;
遗憾的是,Amazon Athena 不(完全)支持 range between
窗口规范。如果您错过了几天,那么您有三个选择:
- 重新定义问题以获取表中可用的最后 7 天并使用上述解决方案。
- 添加缺少的日期。
- 使用
join
解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。