sql—在配置单元中结转值

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

我有一个要求,从 Col_Value 基于上一个 Col_Date (基于列上的逻辑分区) Col_1,Col_2,Col_3,Col_4 ). 当当前行有值时,不能结转使用当前值,也不能从上一日期结转。如果当前行和前一日期中没有值,则应使用最近的结转值。
这是我的输入表。

下面是我迄今为止尝试的sql。

select *,
case 
    when col_value is null 
        then lag(Col_Value) over (PARTITION BY Col_1,Col_2,Col_3,Col_4 order by Col_Date) 
    else col_value
end as Carry_Fowrard_Value
from carry_table

我用了 lag 分析功能,并能够得到以下结果的基础上,我分享了上面的sql。但是对于突出显示的行,我得到了null,因为上一个日期没有值。如何根据上次可用值结转价值?

下面是预期输出。

非常感谢您的帮助。

wn9m85ua

wn9m85ua1#

配置单元支持忽略 NULL 上的值 FIRST_VALUE() 以及 LAST_VALUES() . 唉,它不支持这一点 LAG() ,但您可以使用 LAST_VALUE() :

select ct.*,
       last_value(Col_Value, TRUE) over (partition by Col_1, Col_2, Col_3, Col_4 order by Col_Date)
from carray_table ct;

这应该完全满足您的需要,而不需要子查询。
注意:配置单元语法是非标准的。标准语法是 IGNORE NULLS ,而不是第二个论点。

5q4ezhmt

5q4ezhmt2#

尝试以下操作-首先计算 NULL 值,然后用它填充这些空值 max() 分区中的值。
这是postgresql中的演示,但也可以在hive中使用。

select
  Col_1, 
  Col_2, 
  Col_3, 
  Col_4, 
  Col_Date,
  Col_Value,
  coalesce(Col_Value, max(Col_Value) over (partition by Col_1, Col_2, Col_3, Col_4, rn)) as Carry_Forward_Value
from
(
  select
      *,
      count(Col_Value) over (partition by Col_1, Col_2, Col_3, Col_4 order by Col_Date) as rn
  from carry_table
) subq

输出:

| col_1 | col_2 | col_3 | col_4 | col_date   | col_value | carry_forward_value |
| ----- | ----- | ----- | ----- | ---------- | --------- | ------------------- |
| ES    | A1    | X1    | Y1    | 2019-12-31 | 0         | 0                   |
| ES    | A1    | X1    | Y1    | 2020-01-01 |           | 0                   |
| ES    | A1    | X1    | Y1    | 2020-01-31 | 3         | 3                   |
| ES    | A1    | X1    | Y1    | 2019-02-01 | 4         | 4                   |
| ES    | A1    | X1    | Y1    | 2019-03-31 |           | 4                   |
| ES    | A1    | X1    | Y1    | 2019-02-29 |           | 4                   |
| ES    | A1    | X1    | Y1    | 2019-03-01 |           | 4                   |
| ES    | A1    | X1    | Y1    | 2019-04-01 | 6         | 6                   |
| ES    | A1    | X1    | Y1    | 2019-04-30 |           | 6                   |

相关问题