如何在Google Sheets的QUERY分组中实现类似first的聚合功能?
解决Google Sheets按排序顺序提取每月期初余额的方案
因为Google Sheets的QUERY函数确实没有first()聚合函数,结合你的数据已经按固定顺序(行ID等)排序的特点,这里提供几种可行方案:
方法一:辅助列标记+QUERY筛选
添加辅助列:在数据右侧新增一列(比如D列),D2单元格输入公式,判断当前行的年月是否为该月首次出现:
=IF(YEAR(A2)&MONTH(A2)<>YEAR(A1)&MONTH(A1), "首次", "")下拉填充整列,该列会在每个月的第一条记录行标记“首次”。
QUERY筛选提取:用QUERY筛选出标记为“首次”的行,同时提取年月和余额:
=QUERY(A:D, "SELECT YEAR(A), MONTH(A), C WHERE D='首次' LABEL YEAR(A)'年份', MONTH(A)'月份', C'期初余额'", 1)
方法二:无辅助列,用ARRAYFORMULA直接提取
利用LET函数定义变量,先获取所有唯一的年月组合,再匹配每个年月第一次出现的行位置,提取对应余额:
=ARRAYFORMULA( LET( dates, A2:A, balances, C2:C, years, YEAR(dates), months, MONTH(dates), unique_ym, UNIQUE(years&"|"&months), {SPLIT(unique_ym, "|"), INDEX(balances, MATCH(unique_ym, years&"|"&months, 0))} ) )
这个公式会直接输出三列:年份、月份、对应月份的第一条余额。
方法三:QUERY结合行号聚合
因为数据已按顺序排序,行号越小的记录出现越早,所以可以通过聚合最小行号来定位每月第一条记录:
=ARRAYFORMULA( LET( grouped_data, QUERY({ROW(A2:A), YEAR(A2:A), MONTH(A2:A), C2:C}, "SELECT Col2, Col3, MIN(Col1) GROUP BY Col2, Col3", 0), {INDEX(grouped_data,,1), INDEX(grouped_data,,2), INDEX(C:C, INDEX(grouped_data,,3))} ) )
逻辑是:先通过QUERY按年月分组,取每组的最小行号(即该月第一条记录的行号),再通过行号提取对应的余额。
内容的提问来源于stack exchange,提问作者Frischling
相关产品推荐
相关产品推荐

