使用 google 表查询来确定 Id 每个月离线的天数

Using google sheets query to determine the amount of days an Id is offline during each month

我有一个 google sheet 可以跟踪 Id 何时离线以及何时恢复。这个sheet中的每一行都有对象的Id,下线日期,返回日期,以及是否统计的布尔值。

在 Sheet2 上,我想跟踪对象在过去一年中每个月离线的天数。

示例数据

Id      StartDate   EndDate    Bool
999999  1/5/2020    1/10/2020  TRUE
999999  12/25/2020  1/4/2020   TRUE
888888  10/1/2019   1/20/2020  TRUE
888888  1/21/2020   1/30/2020  TRUE

工作表 2

Id      2/1/2020  1/1/2020  12/1/2019  11/1/2019  10/1/2019  9/1/2019
999999     15        15        15         15         15         15
888888     111       111       111        111        111        111

期望的输出

Id      2/1/2020  1/1/2020  12/1/2019  11/1/2019  10/1/2019  9/1/2019
999999     0         9          7          0          0         0
888888     0         29         31         30         31        0

Google Sheet Example

为了查找产品离线的天数,我做了这个

=SUM(QUERY(Sheet1!$A:$D,CONCATENATE("select datediff(C,B) where D=TRUE and A=",$A2)))

但是它不检查日期是否在一个月内,我正在考虑在 datediff 函数中使用 if 语句,它可以像这样工作,

select datediff(ifs(StartDate<1stOfTheMonth,1stOfTheMonth,StartDate>1stOfTheMonth and StartDate<EndOfMonth,StartDate,StartDate>EndOfMonth,EndOfMonth),ifs(EndDate>EndOfMonth,EndOfMonth,EndDate<EndOfMonth and EndDate>StartOfMonth,EndDate,EndDate<1stOfTheMonth,1stOfTheMonth)) where ...

如果开始日期在月初之前,则从该月开始计算天数,如果开始日期在该月中,则从开始日期计算天数,如果开始日期在该月之后,它 returns 0 天,因为它是从月底到月底计算的。

如果结束日期在月末之后,则计算到月末,如果结束日期在月中,则计算到结束日期,如果结束日期在月之前它 returns 0 天,因为它是从月初到月初计算的。

我希望它能工作,但我不知道如何将它实现到查询函数中。

在您的示例上创建一个新选项卡 sheet,将此公式放在 A1 中,然后将顶行的格式设置为格式>数字>更多格式>自定义数字格式:

嗯嗯年

=ARRAYFORMULA(TRANSPOSE(QUERY(VLOOKUP(SEQUENCE(COUNTA(Sheet1!B2:B)*(MAX(Sheet1!C2:C-Sheet1!B2:B)+1),1,0)/(MAX(Sheet1!C2:C-Sheet1!B2:B)+1)+2,{ROW(Sheet1!B2:B),Sheet1!A2:A,IF((Sheet1!B2:B+SEQUENCE(1,MAX(Sheet1!C2:C-Sheet1!B2:B)+1,0)<=Sheet1!C2:C)*Sheet1!D2:D,IFERROR(EOMONTH(Sheet1!B2:B+SEQUENCE(1,MAX(Sheet1!C2:C-Sheet1!B2:B)+1,0),-1)+1),)},MOD(SEQUENCE(COUNTA(Sheet1!B2:B)*(MAX(Sheet1!C2:C-Sheet1!B2:B)+1),1,0),MAX(Sheet1!C2:C-Sheet1!B2:B)+1)*{0,1}+{2,3}),"select Col2,Count(Col2) where Col2 is not null group by Col2 pivot Col1 order by Col2 desc label Col2'ID'")))