首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据特定标准建立数据的Qlik感觉脚本

根据特定标准建立数据的Qlik感觉脚本
EN

Stack Overflow用户
提问于 2020-05-06 15:10:20
回答 2查看 334关注 0票数 1

对不起,如果我错过了一些明显的东西,因为我试图学习Qlik的感觉。

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

serial.

  • 的第一次丢失费用现在切换到查找丢失费用的串行+后缀:
  • a。如果发现丢失的学分-忽略数据并继续到下一个丢失的费用
  • b。如果没有找到丢失的学分,请从丢失的费用(不包括损失的费用)
    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

我试着只做集合分析,但没有得到预期的结果。

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

代码语言:javascript
复制
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
;

然后,在应用程序中,将每个系列中所有损失的费用相加起来。

代码语言:javascript
复制
sum({$<"Charge Type"={"Lost Charges"}>} Value )

但我不知道如何使它只在第一次损失费用之后的和值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-11 14:26:13

多亏了巴达克,我才能达到预期的效果。

我把我的代码建立在他的回答之上,并作了一些补充/修改。

第一,我加载了所有的数据,并添加了一个信用标志,通过映射,其中收费类型是“损失学分”(稍后使用)

代码语言:javascript
复制
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,其中损失的信用额<>损失了费用)

代码语言:javascript
复制
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
;

然后将上述映射应用于主数据。

代码语言:javascript
复制
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
;

最后,我能够用集合分析(替换每一列的收费类型)将费用总额分解为单独的列。

代码语言:javascript
复制
sum({<Before_After={'After'},"Charge Type"={"Lost Charges"}>} Value)
票数 1
EN

Stack Overflow用户

发布于 2020-05-07 09:17:52

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

(temp_CHARGES只是我提供的示例数据的版本)

在下一步中,您将看到为什么在下一步使用映射加载而不是联接

代码语言:javascript
复制
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()工作。

代码语言:javascript
复制
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
;

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

然后,通过一些简单的集分析,我可以得到这张桌子的前端

代码语言:javascript
复制
sum({<BEFORE_AFTER={'After First Lost'}>} Value)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61638682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档