Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
Ноябрь 23, 2017, 04:47:38 am

Автор Тема: Расчет даты последней покупки в скрипте Qlik Sense/Qlikview  (Прочитано 312 раз)

Оффлайн HalLex

  • Новичок
  • *
  • Сообщений: 11
  • Страна: ru
  • Рейтинг: +2/-0
    • Просмотр профиля
Доброго времени суток!

В своём примере расчета числа повторных покупок, Андрей Свиридов приводит такой вот код:


//***Автор скрипта Свиридов Андрей
ДанныеПродаж:
LOAD НомерСчета,
ДатаСчета,
КодКлиента,
sum(Сумма)as Сумма
FROM
Продажи.qvd (qvd)
Group By НомерСчета, ДатаСчета, КодКлиента;

//Используем резидентную загрузку для формирования таблицы с уникальными идентификаторами клиентов
Temp:
LOAD Distinct
КодКлиента as CustomerID
Resident ДанныеПродаж;
//В переменнуя Score будет записываться дата последнего счета по каждому клиенту

Set Score = 0;

//Первый цикл FOR перебирает каждого клиента в таблеце Temp

FOR i=0 to NoOfRows('Temp')-1
//В переменную Customer записывается идентификатор клиента на каждой итерации цикла
Let Customer = Peek('CustomerID',$(i),'Temp');

//Таблица Temp1 содержит даты всех счетов по каждому клиенту
Temp1:
NoConcatenate

Load
ДатаСчета as ДатаСчета1
Resident ДанныеПродаж
Where КодКлиента = '$(Customer)';//Каждый клиент попадает в параметр отбора

//Второй цикл вычисляет самую позднюю дату счета
FOR l=0 to NoOfRows('Temp1')-1
 IF(Peek('ДатаСчета1',$(l),'Temp1')>$(Score)) then
 LET Score = Peek('ДатаСчета1',$(l),'Temp1');//Дата счета записывается в переменную Score
 ENDIF
NEXT;

DROP Table Temp1;//больше данные этой таблицы не нужны, она заполнится следующим клиентом на следующей итерации

//Формируем из данных переменных таблицу

Temp2:
LOAD
'$(Customer)' as Client,
'$(Score)' as LastDate
AutoGenerate (1);

SET Score = 0;//Присваиваем переменной значение 0, необходимо для последующей работы цикла

NEXT;

//присоединяем дополнительное поле к таблице по ключу "КодКлиента"

Left Join (ДанныеПродаж)
LOAD
Client as КодКлиента,
LastDate as ДатаПоследнегоСчета
Resident Temp2;

//Избавляемся от лишних таблиц

DROP Table Temp;
DROP Table Temp2;

//Создаем новую таблицу используя резидентную загрузку

Temp3:
NoConcatenate
LOAD
НомерСчета,
ДатаСчета,
КодКлиента,
Сумма,
ДатаПоследнегоСчета,
If(ДатаПоследнегоСчета<MonthEnd(AddMonths(Today(),-2)),1,0) as ПотеряныйКлиент,//Клиенты не совершившие покупку более месяца
If(ДатаПоследнегоСчета<MonthEnd(AddMonths(Today(),-2)),Num(Month(ДатаПоследнегоСчета)),) as МесяцПотериКлиента,// Месяц в котором клиент совершал последнюю покупку
If(ДатаПоследнегоСчета>MonthEnd(AddMonths(Today(),-2)),Num(Month(ДатаСчета)),) as МесяцНаличияКлиента//Месяц в котором клмент остается клиентом
Resident ДанныеПродаж;

//Убираем таблицу
DROP Table ДанныеПродаж;

//Переименовывыем таблицу
RENAME Table Temp3 to ДанныеПродаж;

В данном цикле, вычисляем самую позднюю дату счета. Подскажите пожалуйста, как преобразовать цикл, что бы вычислить наоборот, первую дату покупки?
Спасибо!!

FOR l=0 to NoOfRows('Temp1')-1
IF(Peek('ДатаСчета1',$(l),'Temp1')>$(Score)) then
 LET Score = Peek('ДатаСчета1',$(l),'Temp1');//Дата счета записывается в переменную Score
ENDIF

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 982
  • Страна: ru
  • Рейтинг: +97/-0
    • Просмотр профиля
Re: Расчет даты последней покупки
« Ответ #1 : Октябрь 16, 2017, 01:43:14 pm »
Привет, для чего использовать циклы?

Можно ведь сделать запрос на ID клиента и максимальную дату, т.о. мы получаем таблицу с ИД клиента и датой последней покупки. Т.е. получаем то же самое но намного быстрее и легче.

Оффлайн HalLex

  • Новичок
  • *
  • Сообщений: 11
  • Страна: ru
  • Рейтинг: +2/-0
    • Просмотр профиля
Re: Расчет даты последней покупки
« Ответ #2 : Октябрь 16, 2017, 02:42:15 pm »
А Вы могли бы привести пример такого кода (запроса)?

Неофициальный форум пользователей QlikView & Qlik Sense

Re: Расчет даты последней покупки
« Ответ #2 : Октябрь 16, 2017, 02:42:15 pm »

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 982
  • Страна: ru
  • Рейтинг: +97/-0
    • Просмотр профиля
Re: Расчет даты последней покупки
« Ответ #3 : Октябрь 16, 2017, 03:17:03 pm »
LOAD
КодКлиента as CustomerID,
max(Дата) As ДатаКрайнейСделки
Resident ДанныеПродаж
group by КодКлиента;

Оффлайн HalLex

  • Новичок
  • *
  • Сообщений: 11
  • Страна: ru
  • Рейтинг: +2/-0
    • Просмотр профиля
Re: Расчет даты последней покупки
« Ответ #4 : Октябрь 16, 2017, 08:43:26 pm »
Решение прекрасно подошло для задачи, большое спасибо.

Подскажите, а есть решение, если мне требуется найти минимальный и максимальный интервал в днях, между покупками для покупателя?

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 982
  • Страна: ru
  • Рейтинг: +97/-0
    • Просмотр профиля
Re: Расчет даты последней покупки
« Ответ #5 : Октябрь 17, 2017, 07:44:29 am »
Сначала рассчитайте интервалы между покупками, затем рассчитывайте min, max.
Почитайте про previous & peek в хелпе

Оффлайн HalLex

  • Новичок
  • *
  • Сообщений: 11
  • Страна: ru
  • Рейтинг: +2/-0
    • Просмотр профиля
Re: Расчет даты последней покупки
« Ответ #6 : Октябрь 18, 2017, 02:10:07 pm »
Подскажите, а как выполнять расчет именно для конкретного клиента из таблицы, а не все по порядку?

Test1:
Load
КодКлиента,
Date(ДатаСчета) as ДатаСчета1,
Previous (Date(ДатаСчета)) as Previuos,
ДатаСчета - Previous (Date(ДатаСчета)) as Разница
Resident DistClients
Order by КодКлиента;

Если брать простое использование функции, вычитается все по порядку. Соответственно, каждое последнее вычитание, это последняя покупка одного клиента и первая другого.

Неофициальный форум пользователей QlikView & Qlik Sense

Re: Расчет даты последней покупки
« Ответ #6 : Октябрь 18, 2017, 02:10:07 pm »

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 982
  • Страна: ru
  • Рейтинг: +97/-0
    • Просмотр профиля
Re: Расчет даты последней покупки
« Ответ #7 : Октябрь 18, 2017, 03:20:54 pm »
Используйте проверку
load
...
if(КодКлиента=Previous(КодКлиента),
ДатаСчета - Previous (Date(ДатаСчета))) as Разница
...
Resident DistClients
Order by КодКлиента;

Оффлайн HalLex

  • Новичок
  • *
  • Сообщений: 11
  • Страна: ru
  • Рейтинг: +2/-0
    • Просмотр профиля
Re: Расчет даты последней покупки
« Ответ #8 : Октябрь 18, 2017, 05:32:07 pm »
Test1:
Load
КодКлиента,
Date(ДатаСчета) as ДатаСчета1,
Previous(ДатаСчета) as Previous,
if(КодКлиента = Previous(КодКлиента), ДатаСчета-Previous(Date(ДатаСчета))) as Разница
Resident DistClients
Order by КодКлиента, ДатаСчета;


MinMax:
Load
КодКлиента,
If(КодКлиента, Min(Разница)) as МинДнейМеждЗак,
If(КодКлиента, Max(Разница)) as МаксДнейМеждЗак
Resident Test1
Group by КодКлиента;

Для нахождения минимальной и максимальной разницы, решил так же использовать if. Максимум считает для каждого покупателя, а минимум только для некоторых, избирательно. Подскажите, в чем ошибка?

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 982
  • Страна: ru
  • Рейтинг: +97/-0
    • Просмотр профиля
Re: Расчет даты последней покупки
« Ответ #9 : Октябрь 18, 2017, 07:18:33 pm »
Странно, что он вообще считает.
Зачем условия при группировке?
Просто вычисляйте минимум и максимум для клиента.

Оффлайн HalLex

  • Новичок
  • *
  • Сообщений: 11
  • Страна: ru
  • Рейтинг: +2/-0
    • Просмотр профиля
Re: Расчет даты последней покупки
« Ответ #10 : Октябрь 18, 2017, 08:28:49 pm »
Сначала так и пробовал, не группировать. Но ругается на выражение.




MinMax << Test1
Ошибка скрипта: Invalid expression
Произошла следующая ошибка:
Invalid expression
Ошибка произошла здесь:
MinMax:
Load
КодКлиента,
If(КодКлиента, Min(Разница)) as МинДнейМеждЗак,
If(КодКлиента, Max(Разница)) as МаксДнейМеждЗак
Resident Test1
Произошла следующая ошибка:
Invalid expression
Ошибка произошла здесь:
?
Данные не загружены. Исправьте ошибку и повторите загрузку.

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 982
  • Страна: ru
  • Рейтинг: +97/-0
    • Просмотр профиля
Re: Расчет даты последней покупки
« Ответ #11 : Октябрь 19, 2017, 03:38:55 pm »
мин и макс работают только при группировке.

Оффлайн HalLex

  • Новичок
  • *
  • Сообщений: 11
  • Страна: ru
  • Рейтинг: +2/-0
    • Просмотр профиля
Re: Расчет даты последней покупки
« Ответ #12 : Октябрь 19, 2017, 07:23:24 pm »
Load
КодКлиента,
Min(Разница) as МинДнейМеждЗак,
Max(Разница) as МаксДнейМеждЗак
Resident Test1
Group By КодКлиента;

Спасибо!!!

Оффлайн HalLex

  • Новичок
  • *
  • Сообщений: 11
  • Страна: ru
  • Рейтинг: +2/-0
    • Просмотр профиля
Re: Расчет даты последней покупки
« Ответ #13 : Октябрь 20, 2017, 05:40:27 pm »
Возник еще вопрос по ходу.... Не могу сообразить, как мне объяснить функции autonumber, пронумеровать дату первой покупки для каждого покупателя. Есть код клиента, есть даты его покупок, есть дата первой покупки. Идея в том, что бы присвоить "1" первой его покупке, для определения количества новых покупателей за выбранную дату покупки. Либо пронумеровать каждую дату покупки (1,2,3.....), но так для каждого покупателя, начиная с "1".

Оффлайн HalLex

  • Новичок
  • *
  • Сообщений: 11
  • Страна: ru
  • Рейтинг: +2/-0
    • Просмотр профиля
Re: Расчет даты последней покупки
« Ответ #14 : Ноябрь 12, 2017, 01:24:31 pm »
НумерацияПокупок:
   LOAD
   Distinct (КодКлиента) as ClientID,
   ДатаСчета as DateSale,
   AutoNumber(ДатаСчета,[КодКлиента])
   resident DistClients;

Вроде как разобрался)