使用 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
为了查找产品离线的天数,我做了这个
=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'")))
我有一个 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
为了查找产品离线的天数,我做了这个
=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'")))