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

SQL如何按ID、QTY分组计算新建TYPE_NUMERIC列和、最早日期及行数

实现方案

从你给出的预期输出倒推,实际分组维度为ID、QTY、DATE,对应SQL如下:

WITH calc_type AS (
    -- 第一步计算TYPE_NUMERIC字段
    SELECT 
        *,
        CASE TYPE
            WHEN 'IN' THEN -1 
            WHEN 'OUT' THEN 1
        END AS TYPE_NUMERIC
    FROM `SALES_TABLE`
),
rank_rows AS (
    -- 给每个分组内的行按日期排序,标记排序第一的行用于后续取对应TYPE
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY ID, QTY, DATE ORDER BY DATE ASC) AS rn
    FROM calc_type
)
-- 分组聚合得到最终结果
SELECT 
    ID,
    QTY,
    SUM(TYPE_NUMERIC) AS SUM_TYPE_NUMERIC,
    MIN(DATE) AS first_DATE,
    MAX(CASE WHEN rn = 1 THEN TYPE END) AS TYPE,
    COUNT(*) AS count_rows
FROM rank_rows
GROUP BY ID, QTY, DATE
ORDER BY ID, QTY, first_DATE;

如果你确实需要仅按ID和QTY两个维度分组,调整窗口函数的分区规则和聚合的分组规则即可:

WITH calc_type AS (
    SELECT 
        *,
        CASE TYPE
            WHEN 'IN' THEN -1 
            WHEN 'OUT' THEN 1
        END AS TYPE_NUMERIC
    FROM `SALES_TABLE`
),
rank_rows AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY ID, QTY ORDER BY DATE ASC) AS rn
    FROM calc_type
)
SELECT 
    ID,
    QTY,
    SUM(TYPE_NUMERIC) AS SUM_TYPE_NUMERIC,
    MIN(DATE) AS first_DATE,
    MAX(CASE WHEN rn = 1 THEN TYPE END) AS TYPE,
    COUNT(*) AS count_rows
FROM rank_rows
GROUP BY ID, QTY
ORDER BY ID, QTY;

注意事项

如果同一个最早日期下存在多条不同TYPE的记录,可以调整ROW_NUMBER()的排序规则,比如补充其他字段作为排序依据,来确定最终取哪个TYPE值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:06:00