Qlik Sense Script выделяет данные на основе заданных c критериев - PullRequest
1 голос
/ 06 мая 2020

Извините, если мне не хватает чего-то очевидного, когда я пытаюсь изучить Qlik Sense.

У меня есть таблица с примерно 1 мил строками, я хочу отфильтровать данные на основе следующих критериев:

  1. Найдите первые потерянные заряды для серийного номера
  2. Теперь переключите поиск на суффикс serial +, где был обнаружен потерянный заряд, и найдите потерянные кредиты:
    • a. Если найдены потерянные кредиты - игнорируйте данные и переходите к следующему пункту «Потерянные кредиты»
    • b. Если утерянные кредиты не найдены - выберите все данные для этого сериала (весь сериал, а не только суффикс, в котором были найдены потерянные платежи), начиная с утерянных платежей (потерянные платежи не включены)
    • Повторить для каждого серийного номера.

Пример данных:

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

Я попытался выполнить только анализ набора, но не смог получить желаемых результатов.

Я загрузил данные и создал 2-я таблица для фильтрации некоторых данных, которые были до 1-го потерянного платежа, как показано ниже:

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 )

Но я не уверен, как сделать это только суммой значений после 1-го потерянного заряда.

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Значит, вам нужно найти минимум на Serial.

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

Итак, теперь у меня есть такая таблица данных Base Table

Затем с помощью простого анализа множеств я могу получить эту таблицу во внешнем интерфейсе

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

Front end results

1 голос
/ 11 мая 2020

Благодаря Buda c Мне удалось достичь желаемых результатов.

Я основал свой код на его ответе с некоторыми дополнениями / изменениями.

1-й я загрузил все данные и добавил кредитный флаг с помощью сопоставления для строк, где Тип начисления - «Утерянные кредиты» (используется позже)

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...