使用行号更新列值使用上一行值

rhfm7lfc  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(242)

我在Hive里有一张table,内容如下

+---+----------+----------+----------+--------+
| pk|    from_d|      to_d| load_date| row_num|
+---+----------+----------+----------+--------+
|111|2019-03-03|2019-03-03|2019-03-03|       1|
|111|2019-02-02|2019-02-02|2019-02-02|       2|
|111|2019-01-01|2019-01-01|2019-01-01|       3|
|222|2019-03-03|2019-03-03|2019-03-03|       1|
|222|2019-01-01|2019-01-01|2019-01-01|       2|
|333|2019-02-02|2019-02-02|2019-02-02|       1|
|333|2019-01-01|2019-01-01|2019-01-01|       2|
|444|2019-02-02|2019-02-02|2019-02-02|       1|
|555|2019-03-03|2019-03-03|2019-03-03|       1|
+---+----------+----------+----------+--------+

现在我想更新 to_d 列中的行数大于1,使用如下条件

when row_num = 2 then to_d column should have row_num 1 row's from_d - 1 day 
when row_num = 3 then to_d column should have row_num 2 row's from_d - 1 day
and so on

if row_num =1 then to_d should not be updated

请不要误解我的意思,我只是想帮助另一个用户根据配置单元表中的其他表值更新列值
我曾尝试过这种方法,但我无法从这里走得更远

hivapdat

hivapdat1#

可以使用if条件对问题进行排序。。。让我举个例子。选择from_d,to_d,row_num,if(row_num=1,1,row_num-1)。。。因此,每当行数大于1时,您的行数就会减去1。希望你满意。

doinxwow

doinxwow2#

你可以用 LAG 功能如下

select pk, from_d, 
          case when row_num = 1 then to_d else date_sub(lag(to_d) over (), 1) end as to_d, 
          row_num from table;

这会给你想要的结果

+---+----------+----------+-------------------+
| pk|    from_d|      to_d|row_number_window_0|
+---+----------+----------+-------------------+
|111|2019-03-03|2019-03-03|                  1|
|111|2019-02-02|2019-03-02|                  2|
|111|2019-01-01|2019-02-01|                  3|
|222|2019-03-03|2019-03-03|                  1|
|222|2019-01-01|2019-03-02|                  2|
|333|2019-02-02|2019-02-02|                  1|
|333|2019-01-01|2019-02-01|                  2|
|444|2019-02-02|2019-02-02|                  1|
|555|2019-03-03|2019-03-03|                  1|
+---+----------+----------+-------------------+

相关问题