使用上一个行值更新行号
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用上一个行值更新行号相关的知识,希望对你有一定的参考价值。
我在下面的内容中有一个表格
+---+----------+----------+----------+--------+
| 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|
+---+----------+----------+----------+--------+
现在,我要使用类似下面的某些条件来更新row_num> 1的to_d
列
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
[请不要误会我的意思,我只是在尝试解决其他用户的问题之一Updating column values based on the other table values in hive tables
我正在尝试这种方法,但无法从此处继续进行
答案
您可以使用如下所示的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|
+---+----------+----------+-------------------+
另一答案
您可以使用IF条件对问题进行排序...让我举个例子。选择from_d,to_d,row_num,IF(row_num = 1,1,row_num-1)...因此对于每当row_num大于1时,您的row_num都将减去1。希望您满意。
以上是关于使用上一个行值更新行号的主要内容,如果未能解决你的问题,请参考以下文章