Qlikview Qlik Sense脚本基于特定条件搜索数据

Qlikview Qlik Sense脚本基于特定条件搜索数据,qlikview,qliksense,qlik-expression,Qlikview,Qliksense,Qlik Expression,抱歉,如果我在尝试学习Qlik Sense时遗漏了一些明显的内容 我有一个大约有1 mil行的表,我想根据以下标准过滤数据: 查找序列号的第一个丢失的费用 现在将搜索切换到查找丢失费用的序列号+后缀,并查找丢失的信用: a。如果发现丢失的信用-忽略数据并继续下一次丢失的费用 b。如果找不到丢失的积分-从丢失的费用(不包括丢失的费用)开始,选择该序列的所有数据(整个序列,而不仅仅是找到丢失费用的后缀) 对每个序列重复上述步骤 示例数据: 串行Sfx Ser | Sfx值充电日期充电类型 96

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

我有一个大约有1 mil行的表,我想根据以下标准过滤数据:

  • 查找序列号的第一个丢失的费用
  • 现在将搜索切换到查找丢失费用的序列号+后缀,并查找丢失的信用:
    • a。如果发现丢失的信用-忽略数据并继续下一次丢失的费用
    • b。如果找不到丢失的积分-从丢失的费用(不包括丢失的费用)开始,选择该序列的所有数据(整个序列,而不仅仅是找到丢失费用的后缀)
    • 对每个序列重复上述步骤
  • 示例数据:

    串行Sfx Ser | Sfx值充电日期充电类型
    96 1 96 | 1 3.50 2002年9月30日租金
    96 1 96 | 1 3.50 2002年10月31日租金
    96 1 96 | 1 3.50 2002年11月30日租金
    96 1 96 | 1 3.50 2002年12月31日租金
    96 1 96 | 1 3.50 2003年1月31日租金
    96 1 96 | 1 3.50 2003年2月28日租金
    96 1 96 | 1 3.50 2003年3月31日租金
    96 1 96 | 1 3.50 2003年4月30日租金
    96 1 96 | 1 3.50 2003年5月31日租金
    96 1 96 | 1 3.50 2003年6月30日租金
    96 1 96 | 1 3.50 2003年7月31日租金
    96 1 96 | 1 3.50 2003年8月31日租金
    96 1 96 | 1 112.50 2003年10月14日损失费用
    96 2 96 | 2 3.50 2003年11月30日租金
    96 2 96 | 2 3.50 2003年12月31日租金
    96 2 96 | 2 3.50 2004年1月31日租金
    96 3 96 | 3 3.50 2005年8月31日租金
    96 3 96 | 3 3.50 2005年9月30日租金
    96 3 96 | 3 3.50 2005年10月31日租金
    96 4 96 | 4 3.50 2006年1月31日租金
    96 4 96 | 4 3.50 2006年2月28日租金
    96 4 96 | 4 112.50 2006年5月10日损失费用
    96 4 96 | 4-112.50 2006年5月15日信用损失

    结果数据应为:

    串行Sfx Ser | Sfx值充电日期充电类型
    96 2 96 | 2 3.50 2003年11月30日租金
    96 2 96 | 2 3.50 2003年12月31日租金
    96 2 96 | 2 3.50 2004年1月31日租金
    96 3 96 | 3 3.50 2005年8月31日租金
    96 3 96 | 3 3.50 2005年9月30日租金
    96 3 96 | 3 3.50 2005年10月31日租金
    96 4 96 | 4 3.50 2006年1月31日租金
    96 4 96 | 4 3.50 2006年2月28日租金
    96 4 96 | 4 112.50 2006年5月10日损失费用
    96 4 96 | 4-112.50 2006年5月15日信用损失

    我试着只做集合分析,但没有得到想要的结果

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

    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 )
    
    sum({$}值)
    

    但我不知道如何使其仅在第一次丢失费用后求和

    因此您需要找到每个序列的最小值

    (临时费用只是您提供的示例数据的我的版本)

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

    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
    ;
    
    MAP\u SERIAL\u FIRST\u LOST\u费用:
    映射
    负载
    电视连续剧
    [首次丢失日期]
    其中[损失总额]0;
    负载
    电视连续剧
    Sfx,
    总和(值)为[损失总额],
    日期(最小值([充电日期])为[首次丢失日期]
    居民临时工费用
    其中匹配([费用类型],“损失费用”,“损失积分”)
    按序列分组,Sfx
    ;
    
    现在,我可以使用映射的第一个日期来测试其余日期。aplymap函数还允许使用默认值,因此我提供了一个遥远未来的日期“2025/12/12”,以使if()工作

    收费基数:
    负载
    电视连续剧
    Sfx,
    [Ser | Sfx],
    价值
    [收费日期],
    [充电类型],
    applymap('MAP_SERIAL_FIRST_LOST_CHARGES',SERIAL,'2025/12/12')作为[首次丢失日期],
    
    如果(applymap('MAP\u SERIAL\u FIRST\u LOST\u CHARGES',SERIAL,'2025/12/12')那么您需要找到每个序列的最小值

    (临时费用只是您提供的示例数据的我的版本)

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

    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
    ;
    
    MAP\u SERIAL\u FIRST\u LOST\u费用:
    映射
    负载
    电视连续剧
    [首次丢失日期]
    其中[损失总额]0;
    负载
    电视连续剧
    Sfx,
    总和(值)为[损失总额],
    日期(最小值([充电日期])为[首次丢失日期]
    居民临时工费用
    其中匹配([费用类型],“损失费用”,“损失积分”)
    按序列分组,Sfx
    ;
    
    现在,我可以使用映射的第一个日期来测试其余的日期。aplymap函数还允许使用默认值,因此我提供了一个遥远未来的日期“2025/12/12”,以使我的if()工作

    收费基数:
    负载
    电视连续剧
    Sfx,
    [Ser | Sfx],
    价值
    [收费日期],
    [充电类型],
    applymap('MAP_SERIAL_FIRST_LOST_CHARGES',SERIAL,'2025/12/12')作为[首次丢失日期],
    
    如果(applymap(“MAP\u序列号\u FIRST\u LOST\u CHARGES”,序列号,'2025/12/12')多亏了Budac,我才能够达到预期的效果

    我根据他的答案编写代码,并做了一些补充/更改

    首先,我加载了所有数据,并通过映射为费用类型为“损失信用”的行添加了信用标志(稍后使用)

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

    Map\u丢失:
    映射
    负载
    塞尔诺,
    日期(最小值([首次丢失])为[首次丢失日期]
    其中[Lost Total]0
    SerNo分组
    ;
    负载
    塞尔诺,
    Sfx,
    总和(值)为[损失总额],
    日期(最小([充电日期])为[首次丢失]
    常驻原始数据
    其中[Cred Flag]1和
    匹配([费用类型],“损失积分”,“损失费用”)
    Sfx SerNo分组
    ;
    
    然后将上述映射应用于主数据

    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
    ;
    
    CD1:
    负载
    塞尔诺,
    Sfx,
    串行_键,
    价值
    [收费日期],
    [充电类型],
    ApplyMap('Map_Lost',SerNo,'12/12/2025')作为[首次丢失日期],
    如果(ApplyMap('Map_Lost',SerNo,'12/12/2025')谢谢
    
    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)