首页 > 解决方案 > 通过获取同一分区中的上一个日期进行分区

问题描述

我有下表的输出,包括我的 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

标签: sqlhiveapache-spark-sqlhiveql

解决方案


您可以使用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

推荐阅读