在 google 查询中用字符串对多行进行分组

Group many rows with string in google query

我的 google 查询有问题。我需要对几行进行分组,有些是重复的。

在 F2 行,我有 =ArrayFormula(query(TO_TEXT({A3:A\SE(G1:AK1>=B3:B;SE(G1:AK1<=B3:B+C3:C-1;D3:D;"*");"*")});"SELECT * where Col1 IS NOT NULL ORDER BY Col1")) 结果是:

我希望结果与下图相同:

Link 到工作表:enter link description here

有人有什么想法吗?非常感谢!

我添加了一个新的 sheet(“Erik 帮助”)。在单元格 F1 中可以找到以下单个数组公式:

=ArrayFormula({""\TEXT(SEQUENCE(1;DAY(EOMONTH(B3;0));EOMONTH(B3;-1)+1);"d");SORT(UNIQUE(FILTER(A3:A;A3:A<>"")))\IFERROR(VLOOKUP(VALUE(SORT(UNIQUE(FILTER(A3:A;A3:A<>"")))&SEQUENCE(1;DAY(EOMONTH(B3;0));EOMONTH(B3;-1)+1));SPLIT(UNIQUE(FLATTEN(FILTER(A3:A&(B3:B+IF(SEQUENCE(1;14;0)<C3:C;SEQUENCE(1;14;0)))&"~"&D3:D;A3:A<>"")));"~");2;FALSE))})

公式生成所有 left-side 个标签、所有顶部 headers 和所有网格结果。

该公式假定 sheet 的 Col D 中的所有日期都在同一 month/year 中(根据您发布的图像 运行 1-31)。

它还假设没有事件会超过 14 天。如果任何事件 超过 14 天,您需要将公式中的 14 更改为任何一个事件可能跨越每个 ID 的最大可能天数。

进一步假设每个 ID 不会在相同日期重叠任何两个“合理”标签。

这个公式的复杂性超出了这个免费 volunteer-run 论坛的标准。我相信您会明白,除了开发公式外,我没有时间解释它。我鼓励您(或其他可能感兴趣的人)深入研究、拆解并独立探索它的工作原理。

使用:

=INDEX(REGEXREPLACE(TO_TEXT(QUERY(SPLIT(FLATTEN(
 IF(COLUMN(1:1)<=C3:C; A3:A&"×"&TEXT(B3:B+COLUMN(1:1)-1; 
 "yyyymmdd\¤d")&"×"&D3:D; )); "×"); 
 "select Col1,max(Col3) 
  where Col2 is not null 
  group by Col1 
  pivot Col2")); "^(.*¤)";))


强制日期在第 1 行:

=ARRAYFORMULA({IFERROR(QUERY(QUERY(SPLIT(FLATTEN(
 IF(COLUMN(1:1)<=C3:C; A3:A&"×"&B3:B+COLUMN(1:1)-1&"×"&D3:D; )); "×"); 
 "select Col1,max(Col3) where Col2 is not null group by Col1 pivot Col2"); "limit 0 label Col1'xx'"; 1)*1);
 QUERY(QUERY(SPLIT(FLATTEN(
 IF(COLUMN(1:1)<=C3:C; A3:A&"×"&B3:B+COLUMN(1:1)-1&"×"&D3:D; )); "×"); 
 "select Col1,max(Col3) where Col2 is not null group by Col1 pivot Col2"); "offset 1"; 0)})

更新:

=ARRAYFORMULA(IFERROR({IFERROR(QUERY(QUERY(SPLIT(FLATTEN(
 IF((MONTH(B3:B)=MONTH(D1))*(COLUMN(1:1)<=C3:C); A3:A&"×"&B3:B+COLUMN(1:1)-1&"×"&D3:D; )); "×"); 
 "select Col1,max(Col3) where Col2 is not null group by Col1 pivot Col2"); "limit 0 label Col1'xx'"; 1)*1);
 QUERY(QUERY(SPLIT(FLATTEN(
 IF((MONTH(B3:B)=MONTH(D1))*(COLUMN(1:1)<=C3:C); A3:A&"×"&B3:B+COLUMN(1:1)-1&"×"&D3:D; )); "×"); 
 "select Col1,max(Col3) where Col2 is not null group by Col1 pivot Col2"); "offset 1"; 0)}; "no data"))