QlikSense 自动日历功能如何工作?

How does the QlikSense AutoCalendar function work?

拆开我的一个Sense App中的自动生成代码,我发现自动日历功能很棒,我已经修改如下,但我不知道它是如何工作的!有人可以提供一些文件吗?

[autoCalendar]: 
  DECLARE FIELD DEFINITION Tagged ('$date')
FIELDS
  Dual(Year(), YearStart()) AS [Year] Tagged ('$axis', '$year')
  ,Dual('Q'&Num(Ceil(Num(Month())/3)),Num(Ceil(NUM(Month())/3),00)) AS [Quarter] Tagged ('$quarter')
  ,Dual(Year()&'-Q'&Num(Ceil(Num(Month())/3)),QuarterStart()) AS [YearQuarter] Tagged ('$axis', '$yearquarter')
  ,Month() AS [Month] Tagged ('$month')
  ,Dual(Year()&'-'&Month(), monthstart()) AS [YearMonth] Tagged ('$axis', '$yearmonth')
  ,Dual('W'&Num(Week(),00), Num(Week(),00)) AS [Week] Tagged ('$weeknumber')
  ,Date(Floor()) AS [Date] Tagged ('$date')
  /*User added date components*/
  ,Dual(Year(), if(Year()=Year(today()),YearStart(),null)) AS [ThisYear] Tagged ('$axis', '$thisyear')
  ,Dual(Year()&'-Q'&Num(Ceil(Num(Month())/3)), if(Year()=Year(today()),QuarterStart(),null)) AS [ThisYearQuarter] Tagged ('$axis', '$thisyearquarter')
  ,Dual(Year()&'-'&Month(), if(Year()=Year(today()), monthstart(),null)) AS [ThisYearMonth] Tagged ('$axis', '$thisyearmonth')
  ,Dual(Year(), if(Year()=(Year(today())-1),YearStart(),null)) AS [LastYear] Tagged ('$axis', '$lastyear')
  ,Dual(Year()&'-Q'&Num(Ceil(Num(Month())/3)), if(Year()=(Year(today())-1),QuarterStart(),null)) AS [LastYearQuarter] Tagged ('$axis', '$lastyearquarter')
  ,Dual(Year()&'-'&Month(), if(Year()=(Year(today())-1), monthstart(),null)) AS [LastYearMonth] Tagged ('$axis', '$lastyearmonth')
 ;


DERIVE FIELDS FROM FIELDS [StartDate] USING [autoCalendar] ;

这是遍历每个条目还是遍历日历中的每一天?在我看来它像前者 - 它可以用于非日期函数吗?

请查看有关 Derived fields

的 Qlik 帮助

http://help.qlik.com/en-US/sense/2.2/Subsystems/Hub/Content/Scripting/derived-fields.htm

页面详情如下

Derived fields

如果您有一组相关的字段,或者如果字段携带的信息在创建维度或度量时可以分解成相关的较小部分,则您可以创建可用于生成派生的字段定义领域。一个示例是 date 字段,您可以从中导出多个属性,例如 yearmonthweek numberday name。所有这些属性都可以使用 Qlik Sense 日期函数在维度表达式中计算,但另一种方法是创建一个对所有日期类型字段通用的日历定义。字段定义存储在数据加载脚本中。

声明日历字段定义

您使用 Declare 语句创建派生字段的定义。这是您定义字段的不同属性的地方,在本例中是与日期相关的属性。每个字段被描述为 <expression> As field_name tagged tag。设置一个或多个标记是可选的,但它会影响派生字段的排序顺序。使用 </code> 引用应从中生成派生字段的数据字段。</p> <pre><code>Calendar: DECLARE FIELD DEFINITION TAGGED '$date' Parameters first_month_of_year = 1 Fields Year() As Year Tagged ('$numeric'), Month() as Month Tagged ('$numeric'), Date() as Date Tagged ('$date'), Week() as Week Tagged ('$numeric'), Weekday() as Weekday Tagged ('$numeric'), DayNumberOfYear(, first_month_of_year) as DayNumberOfYear Tagged ('$numeric') ;

参见:Declare

使用 Derive

将数据字段映射到日历

下一步是使用 Derive 语句将现有数据字段映射到日历。这将创建派生字段。您可以在数据加载脚本中以三种替代方式执行此操作:

按字段名称映射特定字段。

DERIVE FIELDS FROM FIELDS OrderDate,ShippingDate USING Calendar;

使用一个或多个特定字段标签映射所有字段。

DERIVE FIELDS FROM EXPLICIT TAGS '$date' USING Calendar;

映射所有用字段定义的标签之一标记的字段(上例中的 $date)。

DERIVE FIELDS FROM IMPLICIT TAG USING Calendar;

在这种情况下,您可以使用此处三个示例中的任何一个。

参见:Derive

在可视化中使用 derived date 字段

如果您已创建日历定义并像此处示例中那样映射字段,Qlik Sense 已准备好识别派生日期字段。它们位于字段资产面板的日期和时间字段部分。您还将在表达式编辑器中以及创建或编辑维度时找到所有派生字段。