微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将值保存在本地变量HANA SQL脚本中

如何解决将值保存在本地变量HANA SQL脚本中

我试图从一个非空行中获取值,并在后续行中覆盖它,直到出现另一个非空行,然后将其写入后续行中。来自ABAP Background,我不确定如何在HANA sql脚本中完成此操作。这是一张图片显示数据的样子。

Source Data Image

基本上,“ Doe,John”应该被覆盖到所有空行中,直到出现“ Doe,Jane”为止,然后应将“ Doe,Jane”覆盖到空行中,直到出现另一个名称为止。

我的想法是将非空行存储在局部变量中,但是到目前为止,我还没有取得太大的成功。这是我的代码

tempTab1 = SELECT

  CASE WHEN EMPLOYEE <> ''
    THEN lv_emp = EMPLOYEE
  ELSE EMPLOYEE
  END AS EMPLOYEE,FROM :tempTab;

解决方法

通常,数据集中的行是无序的,直到您明确指定SQL的ORDER BY部分。如果您观察到某些命令,则可能是副作用,并且可能会有所不同。因此,首先您必须显式创建一个行号列(假设其名称为RECORD)。 那你应该这样:

  1. 仅选择列中包含非空数据的行。
  2. 使用LEAD(RECORD) over(order by RECORD)来标识下一个非空记录号。
  3. RECORD字段的条件之间,将源数据集加入到步骤3定义的数据集。
with a as (
  select 1 as record,'Val1' as field1 from dummy union
  select 2 as record,'' as field1 from dummy union
  select 3 as record,'' as field1 from dummy union
  select 4 as record,'Val2' as field1 from dummy union
  select 5 as record,'' as field1 from dummy union
  select 6 as record,'' from dummy union
  select 7 as record,'' from dummy union
  select 8 as record,'Val3' as field1 from dummy
),fill_base as (
  select field1,record,lead(record,1,record) over(order by record asc) as next_record
  from a
  where field1 <> '' and field1 is not null
)
select
  a.record,case
      when a.field1 = '' or a.field1 is null
      then f.field1
      else a.field1
  end as field1,a.field1 as field1_original
from a
  left join fill_base as f
    on a.record > f.record
      and a.record < f.next_record

在某些情况下,HANA的性能可能很差,因为它处理窗口功能非常差。

这是另一个更为优雅的解决方案,它具有两个嵌套的窗口函数,而不是强迫您为每一列编写多个选择:How to make LAG() ignore NULLS in SQL Server?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。