【问题标题】:Save value in local variable HANA SQL Script将值保存在局部变量 HANA SQL 脚本中
【发布时间】:2020-09-24 08:55:50
【问题描述】:

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

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

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

tempTab1 = SELECT

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

【问题讨论】:

  • 请提供可执行的 DDL/DML 代码来重现您的场景 - 没有人愿意输入您的屏幕截图数据。
  • 问题是,是否可以在 SQL Script 的空行中写入名称?我正在研究 BW/4HANA,并试图在两个 InfoProvider 之间进行转换。
  • 是的,这是可能的。
  • 这个的 SQL 脚本代码是什么样子的?提前致谢。
  • 这就是 DDL/DML 代码所需要的。

标签: sql hana hana-sql-script


【解决方案1】:

通常,数据集中的行是无序的,直到您明确指定 SQL 的 ORDER BY 部分。如果你观察到一些顺序,它可能是一种副作用,并且可能会有所不同。所以首先你必须明确地创建一个行号列(假设它的名字是RECORD)。 那你应该这样走:

  1. 仅选择列中包含非空数据的行。
  2. 使用LEAD(RECORD) over(order by RECORD) 标识下一个非空记录号。
  3. 将您的源数据集加入到第 3 步中定义的数据集,在 RECORD 字段的条件之间。
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?

【讨论】:

    【解决方案2】:

    可以使用窗口聚合函数LAST_VALUE来实现缺失值的填补。

    样本数据

    CREATE TABLE sample (id integer, sort integer, value varchar(10));
    INSERT INTO sample VALUES (4711, 1, 'Hello');
    INSERT INTO sample VALUES (4712, 2, null);
    INSERT INTO sample VALUES (4713, 3, null);
    INSERT INTO sample VALUES (4714, 4, 'World');
    INSERT INTO sample VALUES (4715, 5, null);
    INSERT INTO sample VALUES (4716, 6, '!');
    

    使用估算值生成一个新列

    SELECT base.*, LAST_VALUE(fill.value ORDER BY fill.sort) AS value_imputed
    FROM sample base
    LEFT JOIN sample fill ON fill.sort <= base.sort AND fill.value IS NOT NULL
    GROUP BY base.id, base.sort, base.value
    ORDER BY base.id, base.sort
    

    结果

    请注意,sort 可以是决定顺序的任何内容(例如时间戳)。

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      相关资源
      最近更新 更多