用以前的数字替换空值

问题描述 投票:0回答:2

我正在尝试获取突出显示期间的先前数字,但以下内容不起作用。

If(Len(Request) = 0 , Peek(NewRequest), Request) as NewRequest

data example

qlikview qliksense qlik-expression
2个回答
0
投票

你是如何尝试创造这个领域的?

我使用以下代码:

RawData:
Load 
  *,
  If(Len(Request) = 0 , Peek(NewRequest), Request) as NewRequest
;
Load * Inline [
EmpID, Period  , Employee, Request
AA   , 1/1/2023, Yellow  , 6
AB   , 2/1/2023, Brown   , 16
AC   , 3/1/2023, Pink    , 12
AA   , 2/2/2023, Yellow  , 5
AB   , 2/1/2023, Brown   , 
AC   , 3/1/2023, Pink    , 
];

我得到以下数据。如您所见,

NewRequest
列已正确填充。


0
投票

如果您正在尝试获取之前

[Request]
+
[Period]
记录的
[Employee]
值,那么您有几个选择:

选项1:
Lookup()
功能

您可以使用

Lookup()
函数 在已加载的表中查找值,包括当前表,给定查找字段、查找值和返回字段。

这是您可以使用的脚本:

RawData:
 // Part 3
Load 
  *,
  Coalesce(EmptyIsNull(Request), Lookup(Request, Key, Key)) as NewRequest
;
 // Part 2
Load *,
    AutoNumber(EmpID & '|' & Period) as Key
;
 // Part 1
Load * Inline [
EmpID, Period  , Employee, Request
AA   , 1/1/2023, Yellow  , 6
AB   , 2/1/2023, Brown   , 16
AC   , 3/1/2023, Pink    , 12
AA   , 2/2/2023, Yellow  , 5
AB   , 2/1/2023, Brown   , 
AC   , 3/1/2023, Pink    , 
];

这里发生了什么:

第 1 部分

  • 加载数据。

第二部分

  • 这里我们使用
    AutoNumber()
    函数
    创建一个关键字段。该函数的工作原理是返回一个以
    1
    开头的递增数字,用于字段/值的唯一串联。在这种情况下,我们为
    [EmpID]
    和 [Period]
    fields. We use
    & '|' 的每个串联获得一个唯一的密钥&
    to combine the field values with a pipe
    |` 符号作为最佳实践。

第三部分

  • EmptyIsNull()
    函数
    是将空值 (
    Len([SomeField]) = 0
    ) 视为
    Null
    的简写。所以在这里,
    [Request]
    字段中的空值将被视为
    Null
    s.
  • Coalesce()
    函数是
    If(Not isNull([SomeField]), [SomeField], 'Something else...')
    的简写。所以基本上它是说“如果 [Request] 字段不为空,则使用该字段。如果它is null,则使用
    Lookup(...)
    返回的值。”
  • Lookup()
    函数
    是我们用来“回顾”我们已经加载到表中的记录的方法。因此,当我们使用
    Lookup(Request, Key, Key)
    时,我们的意思是“在
    [Key]
    字段中,查找当前记录的
    [Key]
    值,然后返回您从
    [Request]
    字段中找到的值。

这一切都应该导致 Qlik 在缺少时寻找并找到正确的

[Request]
值:

关于

Lookup()
函数需要注意的一点是,当您有很多表时,它会减慢数据加载速度。下一个选项可能会更快。

选项2:
Mapping
加载前缀和
ApplyMap()
函数

您的另一个选择是使用

Mapping
加载前缀
ApplyMap()
函数
来获取那些先前的值。

这是我们要看的脚本:

RawData:
 // Part 2
Load *,
    AutoNumber(EmpID & '|' & Period) as Key
;
 // Part 1
Load * Inline [
EmpID, Period  , Employee, Request
AA   , 1/1/2023, Yellow  , 6
AB   , 2/1/2023, Brown   , 16
AC   , 3/1/2023, Pink    , 12
AA   , 2/2/2023, Yellow  , 5
AB   , 2/1/2023, Brown   , 
AC   , 3/1/2023, Pink    , 
];


[RequestMap]:
 // Part 3
Mapping Load Distinct
    [Key]
  , [Request]
Resident RawData
  Where Not IsNull( EmptyIsNull([Request]) )
;


[RawData New]:
 // Part 4
Load
    [Key]
  , [EmpID]
  , [Period]
  , [Employee]
  , [Request]
  , If( IsNull(EmptyIsNull(Request)), ApplyMap('RequestMap', [Key]), [Request]) as NewRequest
Resident RawData;

 // Part 5
Drop Table [RawData];

这里有一个解释:

第 1 部分

  • 加载数据。

第二部分

  • 这里我们使用
    AutoNumber()
    函数
    创建一个关键字段。请参阅上一个选项中的解释。

第三部分

  • 这里我们使用
    Mapping
    加载前缀
    加载一个
    Mapping
    表,该表只有两列,第一列是我们“匹配”的字段,第二列是我们替换的字段值与。在我们的例子中,我们的两列是
    [Key]
    字段,其值将被替换,以及
    [Request]
    字段,其值将替换
    [Key]
    字段中的值。所以你可以看到它与前一个选项中的
    Lookup()
    函数有何相似之处,因为我们正在寻找一个要匹配的字段,然后从另一个结果字段加载值。
  • 请注意,我们也使用了
    Distinct
    关键字,它告诉 Qlik 仅加载不同的记录。那是因为映射表只需要唯一的“匹配和替换”选项。
  • 我们还使用
    Where
    子句过滤掉具有空
    [Request]
    值的记录。表达式
    Where Not IsNull( EmptyIsNull([Request]) )
    使用
    EmptyIsNull()
    函数
    (在前面的选项中解释)和
    IsNull()
    函数
    来检查并过滤掉具有空
    [Request]
    值的记录。

这就是我们的

[RequestMap]
桌子在引擎盖下的样子:

第 4 部分

这里我们正在加载一个名为

[RawData New]
的新表——这个表加载的重要部分是这个表达式:

If( IsNull(EmptyIsNull(Request)), ApplyMap('RequestMap', [Key]), [Request]) as NewRequest

这是它在做什么:

  • 首先,在我们的
    If()
    语句中,我们检查当前记录的
    [Request]
    字段是否为空/null。如果是,我们使用
    ApplyMap()
    函数
    “映射”
    [Key]
    字段的值,使用我们之前使用
    [RequestMap]
    加载创建的
    Mapping
    表。所以基本上Qlik会为当前字段取
    [Key]
    值,在
    [RequestMap]
    表的第一列中搜索该值,如果找到它,它将返回
    [RequestMap]
    表第二列中的值.如果它在第一列中找不到匹配值,它将只返回
    Null
    。但是,如果
    [Request]
    字段对于当前记录为 not empty/null,它将简单地返回在
    [Request]
    字段中找到的值。

第五部分

  • 这里我们
    Drop
    原来的
    [RawData]
    表,因为我们不再需要它——我们现在有
    [RawData New]
    表,里面有我们所有的数据,包括新的
    [NewRequest]
    字段。

这应该会产生我们想要的结果:

© www.soinside.com 2019 - 2024. All rights reserved.