You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Google Sheets的QUERY分组中实现类似first的聚合功能?

解决Google Sheets按排序顺序提取每月期初余额的方案

因为Google Sheets的QUERY函数确实没有first()聚合函数,结合你的数据已经按固定顺序(行ID等)排序的特点,这里提供几种可行方案:

方法一:辅助列标记+QUERY筛选

  1. 添加辅助列:在数据右侧新增一列(比如D列),D2单元格输入公式,判断当前行的年月是否为该月首次出现:

    =IF(YEAR(A2)&MONTH(A2)<>YEAR(A1)&MONTH(A1), "首次", "")
    

    下拉填充整列,该列会在每个月的第一条记录行标记“首次”。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:02:40