对不起,如果我错过了一些明显的东西,因为我试图学习Qlik的感觉。
我有一个有大约1百万行的表,我想根据以下条件过滤数据:
serial.
示例数据:
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 )但我不知道如何使它只在第一次损失费用之后的和值。
发布于 2020-05-11 14:26:13
多亏了巴达克,我才能达到预期的效果。
我把我的代码建立在他的回答之上,并作了一些补充/修改。
第一,我加载了所有的数据,并添加了一个信用标志,通过映射,其中收费类型是“损失学分”(稍后使用)
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)
;然后,我按照建议创建了一张地图,添加了信用标志,这是消除部分信用所必需的(IE,其中损失的信用额<>损失了费用)
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-07 09:17:52
所以你需要找到每个序列的最小值。
(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)

https://stackoverflow.com/questions/61638682
复制相似问题