2016-10-25 5 views
0

у меня есть данные в следующем формате в Qlik Sense:Qlik Sense - Отображение данных по временным рядам, агрегированные на заданный период времени

 
Date  Customer Flag 
2016-10-01 A  1 
2016-10-01 B  0 
2016-10-02 A  1 
2016-10-02 C  1 
2016-10-03 A  1 
2016-10-03 B  1 
2016-10-03 C  1 
2016-10-05 C  1 
2016-10-10 A  0 
2016-10-10 B  1 
2016-10-11 C  0 

Я хотел бы, чтобы отобразить эти данные в виде таблицы в Qlik смысле в следующий формат:

 
#Week  Count Distinct Customer Where Flag is 1 
39   2 
40   3 
41   3 

Логика: Мне нужна неделя мудрый подсчет DISTINCT клиентов, которые имеют флаг = 1 в этой Недели, включая одну предыдущую неделю. Итак, здесь Неделя № 40 будет отображать отчетливое количество для Недели 39 и 40. Аналогично, неделя 41 будет отображать отчетливое количество для Недели 40 и 41 и так далее.

Буду признателен, если кто-нибудь может предложить выражение Qlik Sense для вышеуказанного?

ответ

1

Мне кажется, что это должно решаться на уровне сценария вместо того, чтобы пытаться более усложнить выражение/GUI (если вообще возможно)

Скрипт ниже, создаст дополнительную таблицу Dates, которая будет содержать Date - >Week ссылка. Week может использоваться как нормальный размер.

RawData: 
Load * Inline [ 
    Date  , Customer, Flag 
    2016-10-01, A  , 1 
    2016-10-01, B  , 0 
    2016-10-02, A  , 1 
    2016-10-02, C  , 1 
    2016-10-03, A  , 1 
    2016-10-03, B  , 1 
    2016-10-03, C  , 1 
    2016-10-05, C  , 1 
    2016-10-10, A  , 0 
    2016-10-10, B  , 1 
    2016-10-11, C  , 0 
]; 

// Generate week number from the existing dates 
Dates_Temp: 
Load 
    Date, 
    Week(Date) as Week 
Resident 
    RawData 
; 

Concatenate 

// Generate previous week number from the existing dates 
Load 
    Date, 
    Week(Date + 7) as Week // Generate the previous week number 
Resident 
    RawData 
; 

// The following code will remove week 42 
// If week 38 need to be visible just ignore/delete 
// the script below ---> 

// Find the max week from the generated weeks 
MaxWeek: 
Load 
    max(Week) as maxWeek 
Resident 
    Dates_Temp 
; 

// Load the min week in vMaxnWeek variable 
let vMaxWeek = peek('maxWeek'); 

// This table is not needed anymore 
Drop Table MaxWeek; 

NoConcatenate 

// The new Dates table will contain all weeks apart from week 42 
Dates: 
Load 
    * 
Resident 
    Dates_Temp 
Where 
    Week <> $(vMaxWeek) 
; 

Drop Table Dates_Temp; 

let vMaxWeek = null(); 

После выполнения сценария структура данных будет выглядеть следующим образом:

enter image description here

И Dates таблица будет содержать следующие данные:

enter image description here

Как вы можете видеть на каждую дату присутствуют две недели. (Только неделю 39 является одной записи, потому что неделя 38 удаляется из данных не уверен, если его необходимо.)

Таким образом, после этого выражение очень просто:

= count({< Flag = {1} >} distinct Customer) 

И результат:

enter image description here

PS скриншоты взяты из QlikView, но один и тот же код нагрузки и выражение могут быть использованы в QS, а также

+0

Спасибо Stefan! Я просматриваю результаты и обновляю поток как можно скорее. – Suresh

+0

Стефан - конечные результаты кажутся неправильными и не соответствуют требуемой логике. Если вы посмотрите на Неделю 41, должно быть 3 разных счета, так как в них также включена Неделя 40. – Suresh

+0

Извините, мой плохой. 'Week (Date - 7) as Week' должна быть' Week (Date + 7) как Week' ('+' вместо '-'). Я обновлю ответ –

0

В качестве альтернативы отвечу Стефана Qlik Sense обладает отличными функциями, когда дело доходит до дат. Ниже вы можете подключиться к вашему скрипту и создать дополнительные поля на экране селектора, который можно использовать.

CurrencyDatePicker

//AutoCalendar 
[Calendar]: 
    DECLARE FIELD DEFINITION Tagged ('$date') 
FIELDS 
    Dual(Year($1), YearStart($1))           AS [Year] Tagged ('$axis', '$year') 
    ,Dual('Q'&Num(Ceil(Num(Month($1))/3)),Num(Ceil(NUM(Month($1))/3),00)) AS [Quarter] Tagged ('$quarter') 
    ,Dual(Year($1)&'-Q'&Num(Ceil(Num(Month($1))/3)),QuarterStart($1))  AS [YearQuarter] Tagged ('$axis', '$yearquarter') 
    ,Month($1)               AS [Month] Tagged ('$month') 
    ,Dual(Year($1)&'-'&Month($1), monthstart($1))       AS [YearMonth] Tagged ('$axis', '$yearmonth') 
    ,Dual('W'&Num(Week($1),00), Num(Week($1),00))       AS [Week] Tagged ('$weeknumber') 
    ,Date(Floor($1))              AS [Date] Tagged ('$date') 
    /*User added date components*/ 
    ,Dual(Year($1), if(Year($1)=Year(today()),YearStart($1),null))  AS [ThisYear] Tagged ('$axis', '$thisyear') 
    ,Dual(Year($1)&'-Q'&Num(Ceil(Num(Month($1))/3)), if(Year($1)=Year(today()),QuarterStart($1),null)) 
                     AS [ThisYearQuarter] Tagged ('$axis', '$thisyearquarter') 
    ,Dual(Year($1)&'-'&Month($1) 
     , if(Year($1)=Year(today()), monthstart($1),null))    AS [ThisYearMonth] Tagged ('$axis', '$thisyearmonth') 
    ,Dual(Year($1), if(Year($1)=(Year(today())-1),YearStart($1),null)) AS [LastYear] Tagged ('$axis', '$lastyear') 
    ,Dual(Year($1)&'-Q'&Num(Ceil(Num(Month($1))/3)) 
     , if(Year($1)=(Year(today())-1),QuarterStart($1),null))   AS [LastYearQuarter] Tagged ('$axis', '$lastyearquarter') 
    ,Dual(Year($1)&'-'&Month($1) 
     , if(Year($1)=(Year(today())-1), monthstart($1),null))   AS [LastYearMonth] Tagged ('$axis', '$lastyearmonth') 
    ,Dual(date(MonthStart($1),'MMM-YYYY') 
     , if(Monthstart($1)=Monthstart(today()),Monthstart($1),null)) AS [ThisMonth] Tagged ('$axis', '$thismonth') 
    ,Dual(date(MonthStart($1),'MMM-YYYY') 
     , if(Monthstart($1)=Monthstart(addmonths(today(),-1)),Monthstart($1),null)) 
                     AS [LastMonth] Tagged ('$axis', '$lastmonth') 
    ,Dual(Year($1)&'-Q'&Num(Ceil(Num(Month($1))/3)) 
     ,if(QuarterStart($1)=QuarterStart(Today()),QuarterStart($1),null)) 
                     AS [ThisQuarter] Tagged ('$axis', '$thisquarter') 
    ,Dual(Year($1)&'-Q'&Num(Ceil(Num(Month($1))/3)) 
     ,if(QuarterStart($1)=QuarterStart(addmonths(Today(),-3)),QuarterStart($1),null)) 
                     AS [LastQuarter] Tagged ('$axis', '$lastquarter') 
    ,Dual(date(MonthStart($1),'MMM-YYYY') 
     ,if(QuarterStart($1)=QuarterStart(Today()),MonthStart($1),null)) AS [ThisQuarterMonth] Tagged ('$axis', '$thisquartermonths'); 

DERIVE FIELDS FROM FIELDS [CurrencyDate] 
USING [Calendar] ; 

Это будет использовать то же выражение, Стефан.

= count({< Flag = {1} >} distinct Customer) 

на благо делать это таким образом

  • поля скрыты в выпадающем списке, так что не загромождать поле Selecter
  • нескольких дат могут быть обработаны в одном стеке, просто добавить к derive from fields, связанное с ,