Qlik Sense Script 根据特定标准选择数据
Qlik Sense Script sekecting data based of a specific criteria
抱歉,如果我在尝试学习 Qlik Sense 时遗漏了一些明显的东西。
我有一个 table 大约有 100 万行,我想根据以下条件过滤数据:
- 找到连续剧的第一个丢失费用
- 现在将搜索切换到发现 Lost Charge 的序列号 + 后缀并查找 Lost Credits:
- 一个。如果发现丢失的积分 - 忽略数据并继续下一个丢失的费用
- b。 If Lost Credits not Found - Select 该序列的所有数据(整个序列,而不仅仅是找到 Lost Charges 的后缀)从 Lost Charges 开始(Lost Charges 不包括在内)
- 对每个系列重复。
示例数据:
Serial Sfx Ser|Sfx Value Charge Date Charge Type
96 1 96|1 3.50 30/09/2002 Rental Charges
96 1 96|1 3.50 31/10/2002 Rental Charges
96 1 96|1 3.50 30/11/2002 Rental Charges
96 1 96|1 3.50 31/12/2002 Rental Charges
96 1 96|1 3.50 31/01/2003 Rental Charges
96 1 96|1 3.50 28/02/2003 Rental Charges
96 1 96|1 3.50 31/03/2003 Rental Charges
96 1 96|1 3.50 30/04/2003 Rental Charges
96 1 96|1 3.50 31/05/2003 Rental Charges
96 1 96|1 3.50 30/06/2003 Rental Charges
96 1 96|1 3.50 31/07/2003 Rental Charges
96 1 96|1 3.50 31/08/2003 Rental Charges
96 1 96|1 112.50 14/10/2003 Lost Charges
96 2 96|2 3.50 30/11/2003 Rental Charges
96 2 96|2 3.50 31/12/2003 Rental Charges
96 2 96|2 3.50 31/01/2004 Rental Charges
96 3 96|3 3.50 31/08/2005 Rental Charges
96 3 96|3 3.50 30/09/2005 Rental Charges
96 3 96|3 3.50 31/10/2005 Rental Charges
96 4 96|4 3.50 31/01/2006 Rental Charges
96 4 96|4 3.50 28/02/2006 Rental Charges
96 4 96|4 112.50 10/05/2006 Lost Charges
96 4 96|4 -112.50 15/05/2006 Lost Credits
结果数据应该是:
Serial Sfx Ser|Sfx Value Charge Date Charge Type
96 2 96|2 3.50 30/11/2003 Rental Charges
96 2 96|2 3.50 31/12/2003 Rental Charges
96 2 96|2 3.50 31/01/2004 Rental Charges
96 3 96|3 3.50 31/08/2005 Rental Charges
96 3 96|3 3.50 30/09/2005 Rental Charges
96 3 96|3 3.50 31/10/2005 Rental Charges
96 4 96|4 3.50 31/01/2006 Rental Charges
96 4 96|4 3.50 28/02/2006 Rental Charges
96 4 96|4 112.50 10/05/2006 Lost Charges
96 4 96|4 -112.50 15/05/2006 Lost Credits
我尝试只进行集合分析,但无法得到想要的结果。
我已经加载了数据并创建了第二个 table 来过滤一些在第一次丢失费用之前的数据,如下所示:
ChargeData:
LOAD
Serial_KEY,
"Serial number true" as SerNo,
"Suffix number" as Sfx,
Value,
"Charge Date",
"Charge Type",
"Additional Text",
Customer,
"Invoice Document",
Currency,
"Charge Type" &'|'& Date([Charge Date]) as Charge_KEY
FROM [Transform.qvd]
(qvd);
LostCylinders:
Load
SerNo,
Concat(IF([Charge Type]='Lost Charges','L',
IF([Charge Type]='Lost Credits','C',Null()))) as LostFlag
Resident ChargeData
Group by SerNo
;
然后在应用程序中计算每个系列的所有损失费用的总和
sum({$<"Charge Type"={"Lost Charges"}>} Value )
但我不确定如何让它只在第一次丢失费用后求和。
因此您需要找到每个序列号的最小值。
(temp_CHARGES 只是我对您提供的示例数据的版本)
你会在下一步中看到为什么我在下一步中使用映射加载而不是连接
MAP_SERIAL_FIRST_LOST_CHARGES:
mapping
load
Serial,
[First Lost Date]
where [Lost Total]<>0;
load
Serial,
Sfx,
sum(Value) as [Lost Total],
date(min([Charge Date])) as [First Lost Date]
resident temp_CHARGES
where match([Charge Type],'Lost Charges','Lost Credits')
group by Serial,Sfx
;
现在我可以使用映射的第一个日期来测试其余日期。 aplymap 函数还允许使用默认值,因此我提供了一个遥远的未来日期 '2025/12/12' 以使我的 if() 工作
CHARGES_BASE:
load
Serial,
Sfx,
[Ser|Sfx],
Value,
[Charge Date],
[Charge Type],
applymap('MAP_SERIAL_FIRST_LOST_CHARGES',Serial,'2025/12/12') as [First Lost Date],
if(applymap('MAP_SERIAL_FIRST_LOST_CHARGES',Serial,'2025/12/12')<[Charge Date],'After First Lost','Before First Lost') as BEFORE_AFTER
Resident
temp_CHARGES
;
drop table temp_CHARGES
;
所以现在我有这样的数据 table
然后通过一些简单的集合分析我可以在前端得到这个table
sum({<BEFORE_AFTER={'After First Lost'}>} Value)
多亏了 The Budac,我才能够达到预期的效果。
我的代码基于他的回答,还有一些 additions/changes。
1st 我加载了所有数据并通过映射为费用类型为 "Lost Credits" 的行添加了信用标志(稍后使用)
Map_Cred:
Mapping
Load
Serial_KEY,
'1' as [Lost Credit Flag]
FROM [lib://...qvd](qvd)
Where [Charge Type]='Lost Credits'
;
Raw_Data:
LOAD
*,
applymap('Map_Cred',Serial_KEY,' ') as [Cred Flag]
FROM [lib://...qvd](qvd)
;
然后我按照建议创建了一个地图,添加了 Credit Flag,这是消除部分信用所必需的(即 Lost Credits <> Lost Charges)
Map_Lost:
Mapping
load
SerNo,
Date(Min([First Lost])) as [First Lost Date]
where [Lost Total]<>0
Group by SerNo
;
Load
SerNo,
Sfx,
Sum(Value) as [Lost Total],
date(min([Charge Date])) as [First Lost]
Resident Raw_Data
Where [Cred Flag]<>1 and
Match([Charge Type],'Lost Credits','Lost Charges')
group by SerNo,Sfx
;
然后将上面的映射应用到主数据
CD1:
Load
SerNo,
Sfx,
Serial_KEY,
Value,
[Charge Date],
[Charge Type],
ApplyMap('Map_Lost',SerNo,'12/12/2025') as [First Lost Date],
if(ApplyMap('Map_Lost',SerNo,'12/12/2025')<[Charge Date],'After','Before') as Before_After
Resident Raw_Data
;
Drop table Raw_Data
;
最后,我能够使用集合分析将电荷总数分解为单独的列(替换每列的电荷类型)。
sum({<Before_After={'After'},"Charge Type"={"Lost Charges"}>} Value)
抱歉,如果我在尝试学习 Qlik Sense 时遗漏了一些明显的东西。
我有一个 table 大约有 100 万行,我想根据以下条件过滤数据:
- 找到连续剧的第一个丢失费用
- 现在将搜索切换到发现 Lost Charge 的序列号 + 后缀并查找 Lost Credits:
- 一个。如果发现丢失的积分 - 忽略数据并继续下一个丢失的费用
- b。 If Lost Credits not Found - Select 该序列的所有数据(整个序列,而不仅仅是找到 Lost Charges 的后缀)从 Lost Charges 开始(Lost Charges 不包括在内)
- 对每个系列重复。
示例数据:
Serial Sfx Ser|Sfx Value Charge Date Charge Type
96 1 96|1 3.50 30/09/2002 Rental Charges
96 1 96|1 3.50 31/10/2002 Rental Charges
96 1 96|1 3.50 30/11/2002 Rental Charges
96 1 96|1 3.50 31/12/2002 Rental Charges
96 1 96|1 3.50 31/01/2003 Rental Charges
96 1 96|1 3.50 28/02/2003 Rental Charges
96 1 96|1 3.50 31/03/2003 Rental Charges
96 1 96|1 3.50 30/04/2003 Rental Charges
96 1 96|1 3.50 31/05/2003 Rental Charges
96 1 96|1 3.50 30/06/2003 Rental Charges
96 1 96|1 3.50 31/07/2003 Rental Charges
96 1 96|1 3.50 31/08/2003 Rental Charges
96 1 96|1 112.50 14/10/2003 Lost Charges
96 2 96|2 3.50 30/11/2003 Rental Charges
96 2 96|2 3.50 31/12/2003 Rental Charges
96 2 96|2 3.50 31/01/2004 Rental Charges
96 3 96|3 3.50 31/08/2005 Rental Charges
96 3 96|3 3.50 30/09/2005 Rental Charges
96 3 96|3 3.50 31/10/2005 Rental Charges
96 4 96|4 3.50 31/01/2006 Rental Charges
96 4 96|4 3.50 28/02/2006 Rental Charges
96 4 96|4 112.50 10/05/2006 Lost Charges
96 4 96|4 -112.50 15/05/2006 Lost Credits
结果数据应该是:
Serial Sfx Ser|Sfx Value Charge Date Charge Type
96 2 96|2 3.50 30/11/2003 Rental Charges
96 2 96|2 3.50 31/12/2003 Rental Charges
96 2 96|2 3.50 31/01/2004 Rental Charges
96 3 96|3 3.50 31/08/2005 Rental Charges
96 3 96|3 3.50 30/09/2005 Rental Charges
96 3 96|3 3.50 31/10/2005 Rental Charges
96 4 96|4 3.50 31/01/2006 Rental Charges
96 4 96|4 3.50 28/02/2006 Rental Charges
96 4 96|4 112.50 10/05/2006 Lost Charges
96 4 96|4 -112.50 15/05/2006 Lost Credits
我尝试只进行集合分析,但无法得到想要的结果。
我已经加载了数据并创建了第二个 table 来过滤一些在第一次丢失费用之前的数据,如下所示:
ChargeData:
LOAD
Serial_KEY,
"Serial number true" as SerNo,
"Suffix number" as Sfx,
Value,
"Charge Date",
"Charge Type",
"Additional Text",
Customer,
"Invoice Document",
Currency,
"Charge Type" &'|'& Date([Charge Date]) as Charge_KEY
FROM [Transform.qvd]
(qvd);
LostCylinders:
Load
SerNo,
Concat(IF([Charge Type]='Lost Charges','L',
IF([Charge Type]='Lost Credits','C',Null()))) as LostFlag
Resident ChargeData
Group by SerNo
;
然后在应用程序中计算每个系列的所有损失费用的总和
sum({$<"Charge Type"={"Lost Charges"}>} Value )
但我不确定如何让它只在第一次丢失费用后求和。
因此您需要找到每个序列号的最小值。
(temp_CHARGES 只是我对您提供的示例数据的版本)
你会在下一步中看到为什么我在下一步中使用映射加载而不是连接
MAP_SERIAL_FIRST_LOST_CHARGES:
mapping
load
Serial,
[First Lost Date]
where [Lost Total]<>0;
load
Serial,
Sfx,
sum(Value) as [Lost Total],
date(min([Charge Date])) as [First Lost Date]
resident temp_CHARGES
where match([Charge Type],'Lost Charges','Lost Credits')
group by Serial,Sfx
;
现在我可以使用映射的第一个日期来测试其余日期。 aplymap 函数还允许使用默认值,因此我提供了一个遥远的未来日期 '2025/12/12' 以使我的 if() 工作
CHARGES_BASE:
load
Serial,
Sfx,
[Ser|Sfx],
Value,
[Charge Date],
[Charge Type],
applymap('MAP_SERIAL_FIRST_LOST_CHARGES',Serial,'2025/12/12') as [First Lost Date],
if(applymap('MAP_SERIAL_FIRST_LOST_CHARGES',Serial,'2025/12/12')<[Charge Date],'After First Lost','Before First Lost') as BEFORE_AFTER
Resident
temp_CHARGES
;
drop table temp_CHARGES
;
所以现在我有这样的数据 table
然后通过一些简单的集合分析我可以在前端得到这个table
sum({<BEFORE_AFTER={'After First Lost'}>} Value)
多亏了 The Budac,我才能够达到预期的效果。
我的代码基于他的回答,还有一些 additions/changes。
1st 我加载了所有数据并通过映射为费用类型为 "Lost Credits" 的行添加了信用标志(稍后使用)
Map_Cred:
Mapping
Load
Serial_KEY,
'1' as [Lost Credit Flag]
FROM [lib://...qvd](qvd)
Where [Charge Type]='Lost Credits'
;
Raw_Data:
LOAD
*,
applymap('Map_Cred',Serial_KEY,' ') as [Cred Flag]
FROM [lib://...qvd](qvd)
;
然后我按照建议创建了一个地图,添加了 Credit Flag,这是消除部分信用所必需的(即 Lost Credits <> Lost Charges)
Map_Lost:
Mapping
load
SerNo,
Date(Min([First Lost])) as [First Lost Date]
where [Lost Total]<>0
Group by SerNo
;
Load
SerNo,
Sfx,
Sum(Value) as [Lost Total],
date(min([Charge Date])) as [First Lost]
Resident Raw_Data
Where [Cred Flag]<>1 and
Match([Charge Type],'Lost Credits','Lost Charges')
group by SerNo,Sfx
;
然后将上面的映射应用到主数据
CD1:
Load
SerNo,
Sfx,
Serial_KEY,
Value,
[Charge Date],
[Charge Type],
ApplyMap('Map_Lost',SerNo,'12/12/2025') as [First Lost Date],
if(ApplyMap('Map_Lost',SerNo,'12/12/2025')<[Charge Date],'After','Before') as Before_After
Resident Raw_Data
;
Drop table Raw_Data
;
最后,我能够使用集合分析将电荷总数分解为单独的列(替换每列的电荷类型)。
sum({<Before_After={'After'},"Charge Type"={"Lost Charges"}>} Value)