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

BigQuery中按Email分组,基于最小日期选取status_update字段

嘿,我完全get到你的需求了——按Email分组,拿到唯一的AccountID,同时精准抓取每组里最早日期对应的status_update对吧?你提到想用CASE语句来实现这个逻辑,思路很靠谱!下面我给你几种实用的SQL方案,包括你想要的CASE结合窗口函数的写法,还有更常用的高效实现方式:

方案1:用ROW_NUMBER()窗口函数(最推荐)

这是处理这类“分组取首行”问题的标准做法,逻辑清晰且高效:

WITH ranked_records AS (
    SELECT 
        Email,
        AccountID,
        date,
        status_update,
        -- 按Email分组,每组内按日期升序编号,最早的记录编号为1
        ROW_NUMBER() OVER (PARTITION BY Email ORDER BY date ASC) AS rn
    FROM your_table_name
)
SELECT 
    Email,
    AccountID,
    status_update
FROM ranked_records
WHERE rn = 1;

如果同一个Email下有多个记录的日期相同,你可以在ORDER BY里加额外字段(比如status_update或者主键)来确保唯一取值。

方案2:子查询+关联(兼容老版本数据库)

如果你的数据库不支持窗口函数,这种传统方法也能搞定:

SELECT 
    t.Email,
    t.AccountID,
    t.status_update
FROM your_table_name t
INNER JOIN (
    -- 先找出每个Email的最小日期
    SELECT Email, MIN(date) AS min_date
    FROM your_table_name
    GROUP BY Email
) sub 
    ON t.Email = sub.Email 
    AND t.date = sub.min_date;

方案3:CASE结合窗口函数(符合你的思路)

按照你提到的“当date等于min(date)时选取status_update”的逻辑,我们可以用窗口函数MIN()来判断:

SELECT DISTINCT
    Email,
    AccountID,
    -- 只有当前记录的date是组内最小时,才返回status_update,否则为NULL
    CASE WHEN date = MIN(date) OVER (PARTITION BY Email) THEN status_update END AS status_update
FROM your_table_name;

注意:如果同一个Email下有多个记录的date都是最小值,这个方法会返回多条记录,这时候可以结合方案1的ROW_NUMBER()来做去重,或者在窗口函数里加额外排序条件。

额外提醒:如果同一个Email下对应多个不同的AccountID,你需要先确认业务逻辑——是取最早日期对应的AccountID,还是有其他规则?上面的方案都是取最早日期对应的那条记录的AccountID,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Simon Breton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:10:55