问题
如何对满足某个条件的连续值进行分组,或者换句话说,如何对属于同一时间段的所有值进行分组。例如,根据连续出现负利润的天数创建天数组。如果连续 3 天利润为负数,这些天都将属于组“3”
ZN(LOOKUP(SUM([Profit]),0))
IF [Profit no gaps] >= 0 THEN NULL ELSEIF LOOKUP([Profit no gaps],-1) >= 0 THEN MIN([Order Date]) ELSE PREVIOUS_VALUE(#1/1/18#) END
LOOKUP([Profit no gaps],1)
IF [Profit no gaps] >= 0
THEN NULL
ELSEIF [Next Profit Value] >= 0
THEN MIN([Order Date])
ELSE PREVIOUS_VALUE(#1/1/18#)
END
DATEDIFF('day', [Start Date], [End Date]) + 1
IF [Days in Streak] = 1 THEN
WINDOW_SUM(
IF [Days in Streak] = 1
THEN COUNTD([Order Date])
END
)
ELSEIF [Days in Streak] = 2 THEN
WINDOW_SUM(
IF [Days in Streak] = 2
THEN COUNTD([Order Date])
END
)
ELSEIF [Days in Streak] = 3 THEN
WINDOW_SUM(
IF [Days in Streak] = 3
THEN COUNTD([Order Date])
END
)
ELSEIF ...
END / [Days in Streak]
注意:计算字段 [时间段数] 和 [每个时间段组只保留一个日期] 必须为一个时间段中每个可能的天数包含一个条件。如需查看详细原因,请查看文章使用聚合字段定义表计算的详细级别
MIN([Order Date]) = WINDOW_MIN(IF[Days in Streak] = 1 THEN [Start Date] END)
OR MIN([Order Date]) = WINDOW_MIN(IF[Days in Streak] = 2 THEN [Start Date] END)
OR MIN([Order Date]) = WINDOW_MIN(IF[Days in Streak] = 3 THEN [Start Date] END)
OR ...
""
创建 Prep 流程需要更多的前期工作,但从 Prep 输出构建视图比通过表计算构建视图要简单得多。“Grouping Consequtive days.tflx”流程可以演示下列步骤,可从右侧窗格下载。
IF [Profit] < 0
THEN 'negative'
ELSE 'positive'
END
{ PARTITION [Category], [Condition] : { ORDERBY [Order Date] ASC : RANK_DENSE()}}
[行号] + 1
IF ISNULL(DATEDIFF('day', [Order Date-1], [Order Date]))
OR DATEDIFF('day', [Order Date-1], [Order Date]) > 1
MIN([Order Date])\}
END
{ PARTITION [Category], [Condition] : { ORDERBY [Start Date] ASC: RANK_DENSE()}}
[行号] - 1
IF ISNULL(DATEDIFF('day', [Order Date], [Order Date-1]))
OR DATEDIFF('day', [Order Date], [Order Date-1]) > 1
MIN([Order Date])\}
END
{ PARTITION [Category], [Condition] : { ORDERBY [End Date] ASC: RANK_DENSE()}}
DATEDIFF('day', [Start Date],[End Date])+1
Prep 流程输出包含满足条件(利润为负数)和不满足条件的分组的开始日期。可以在“行号”清理步骤中添加一个筛选器,只保留 [Condition]='negative',以排除不满足条件的分组,否则需要将 [Condition] 筛选器添加到视图中。