我正在尝试获取突出显示期间的先前数字,但以下内容不起作用。
If(Len(Request) = 0 , Peek(NewRequest), Request) as NewRequest
你是如何尝试创造这个领域的?
我使用以下代码:
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
列已正确填充。
如果您正在尝试获取之前
[Request]
+ [Period]
记录的 [Employee]
值,那么您有几个选择:
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 ,
];
这里发生了什么:
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()
函数需要注意的一点是,当您有很多表时,它会减慢数据加载速度。下一个选项可能会更快。
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];
这里有一个解释:
AutoNumber()
函数创建一个关键字段。请参阅上一个选项中的解释。Mapping
加载前缀加载一个Mapping
表,该表只有两列,第一列是我们“匹配”的字段,第二列是我们替换的字段值与。在我们的例子中,我们的两列是 [Key]
字段,其值将被替换,以及 [Request]
字段,其值将替换 [Key]
字段中的值。所以你可以看到它与前一个选项中的Lookup()
函数有何相似之处,因为我们正在寻找一个要匹配的字段,然后从另一个结果字段加载值。Distinct
关键字,它告诉 Qlik 仅加载不同的记录。那是因为映射表只需要唯一的“匹配和替换”选项。Where
子句过滤掉具有空[Request]
值的记录。表达式Where Not IsNull( EmptyIsNull([Request]) )
使用EmptyIsNull()
函数(在前面的选项中解释)和IsNull()
函数来检查并过滤掉具有空[Request]
值的记录。这就是我们的
[RequestMap]
桌子在引擎盖下的样子:
这里我们正在加载一个名为
[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]
字段。这应该会产生我们想要的结果: