我有下表,其输出包括我的sql查询的结果,该结果没有给我我想看到的输出(我在pyspark中这样做,所以是hive版本的sql):
这里是我正在运行的查询(我已经尝试了很多这样的变化,包括范围/行和不同的前/后无界等,这些似乎都没有给我想要的输出):
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的先前值(按日期升序排序),因为如果存在说5行相同的日期,然后3行具有不同的下一个日期,我想这3个下一行的下一个date_boundstamp仅为上一个date_1,但是我的查询许多变体,我尝试它们都无法完成:
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