在PowerBI中,我有一个包含3列的简单表:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("TYzBCcAwDAN38dugyk5bdxaT/deICzXN77hDyhSKCkHYwafwbJyaYiUc9I4XaH/1MgHeXQO+bcf7ux0XW3x5Lg==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [id = _t, start = _t, end = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"id", Int64.Type}, {"start", type date}, {"end", type date}})
in
#"Changed Type"
我可以从中创建以下视觉效果
我的挑战是根据上面选择的过滤器来计算时间序列中的总持续时间(以天为单位)。任何帮助将不胜感激。
我尝试了以下DAX公式,但如上所述却给了我疯狂的结果。
YTDDuration =
var start_Date=FIRSTDATE(ALLSELECTED('CALENDAR'[Date]))
var end_Date=LASTDATE(ALLSELECTED('CALENDAR'[Date]))
var current_Start=MAX(Table2[start])
var current_end=MAX(Table2[end])
var bigif=IF(current_end>start_Date&¤t_Start<end_Date,DATEDIFF(MAX(start_Date,current_Start),MIN(end_Date,current_end),DAY),0)
RETURN
CALCULATE(SUMX(Table2, bigif),FILTER(ALL(Table2), Table2[start] <= max(Table2[end])))
关键是要解决日期差异并合并重叠的日期。
答案 0 :(得分:0)
您可以遍历日历表并计算该天属于id
个时间段之一的天数。
YTDDuration =
var current_Start = CALCULATE(MIN(Table2[start]), ALL(Table2))
var current_end = MAX(Table2[end])
RETURN
SUMX(
FILTER('CALENDAR', 'CALENDAR'[Date] <= current_end),
MAXX(ALL(Table2), IF([Date] > [start] && [Date] <= [end], 1, 0))
)
此操作从最短的start
日期开始,并为Date
中某行中start
在end
和Table2
之间的每一天加1。如果没有任何行包含那个Date
,则最大值超过零,并返回零。如果一个或多个匹配项,您最多可以得到一个,我们将在这一天进行计数。
YTD Duration
by end
: