1

抱歉,如果我在尝试学习 Qlik Sense 时遗漏了一些明显的东西。

我有一个大约 1 百万行的表,我想根据以下条件过滤数据:

  1. 查找连续剧的第一个丢失的费用
  2. 现在将搜索切换到找到 Lost Charge 的序列号 + 后缀,然后查找 Lost Credits:
    • 一个。如果找到丢失的信用 - 忽略数据并继续下一个丢失的费用
    • 湾。If Lost Credits not Found - 从 Lost Charges 开始选择该系列的所有数据(整个系列,而不仅仅是找到 Lost Charges 的后缀)(不包括 Lost Charges)
      1. 对每个系列重复。

示例数据:

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

我尝试只进行集合分析,但无法获得预期的结果。

我已经加载了数据并创建了第二个表来过滤一些在第一次丢失费用之前的数据,如下所示:

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 )

但我不知道如何使它只在第一次丢失费用后求和。

4

2 回答 2

2

所以你需要找到每个序列的最小值。

(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
;

所以现在我有一个这样的数据表 基表

然后通过一些简单的集合分析,我可以在前端得到这个表

sum({<BEFORE_AFTER={'After First Lost'}>} Value)

前端结果

于 2020-05-07T09:17:52.150 回答
1

多亏了 The Budac,我才能够达到预期的效果。

我的代码基于他的回答,并进行了一些添加/更改。

第一次我加载了所有数据,并通过映射为 Charge Type 为“Lost Credits”的行添加了一个 Credit Flag(稍后使用)

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)
;

然后我按照建议创建了一个地图,添加了信用标志,这是消除部分信用所必需的(即丢失信用<>丢失费用的地方)

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)
于 2020-05-11T14:26:13.743 回答