sql - 通过获取同一分区中的上一个日期进行分区
问题描述
我有下表的输出,包括我的 sql 查询的结果,它没有给我我想看到的输出(我这样做是在 pyspark 中,所以 sql 的 hive 版本):
这是我正在运行的查询(我已经尝试了一系列变体,范围/行和不同的前/后无界等似乎都没有给我想要的输出):
select id, date_1, acct_num, date_2, txn_am,
min(date_1) OVER(PARTITION BY acct_num
ORDER BY date_1 ASC RANGE BETWEEN 2 PRECEDING AND CURRENT ROW) as lower_bound_timestamp
from abc.def
order by acct_num, date_2
这就是我希望输出的样子(在这个查询中,我只是创建了 lower_bound_timestamp 列)。如果您注意到我想要的关键是 lower_bound_timestamp 不一定是前一行中 date_1 的值,我希望它是 date_1 的前一个值(它按日期 asc 排序),因为如果有 5 行相同的日期后跟 3 行不同的下一个日期,我希望接下来的 3 行只有上一个 date_1 的 lower_bound_timestamp 但是我的查询我尝试的许多变体都没有完成它:
id date_1 acct_num date_2 txn_am lower_bound_timestamp
123 2019-06-26 123 2019-06-10 10 2019-06-26
354 2019-06-26 123 2019-06-15 10 2019-06-26
357 2019-06-28 123 2019-06-15 10 2019-06-26
359 2019-06-30 123 2019-06-17 10 2019-06-28
360 2019-07-05 123 2019-06-18 10 2019-06-30
361 2019-07-05 123 2019-06-20 10 2019-06-30
解决方案
您可以使用range()
, 但带有数字:
select id, date_1, acct_num, date_2, txn_am,
min(date_1) over (partition by acct_num
order by datediff(date_1, '2000-01-01')
ranged between unbounded preceding and 1 preceding
) as prev_date
from abc.def
order by acct_num, date_2
推荐阅读
- firebase - Flutter:StreamBuilder 调用了 3 次
- python - 查找共同构成目标列表的最小列表的算法
- r - r中的数据框,带有绘图栏和数据
- c# - 从故障异常中获取详细信息不显示完整的详细信息
- godot - Godot 单例变量在场景之间重置
- python - 在这个示例代码中,哪个 Python 习语被用来调用函数?
- python - 如何通过api网关使用python lambda函数传递和读取授权承载令牌?
- java - Java 从 JSON 转换为对象列表
- flutter - 在 Flutter 中播放本地视频
- laravel - Laravel Nova Actions BelongsTo 字段不起作用