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

Oracle 10G中如何在GROUP BY查询中获取未分组的销售收据ID?

获取Oracle 10g中每个客户首次销售收据的ID

在Oracle 10g环境下,要获取每个客户首次出现在销售收据记录中的对应ID,直接在原GROUP BY语句中添加收据字段是行不通的——因为GROUP BY会聚合分组内的所有数据,无法保证拿到的是最早日期对应的那条ID。这里给你两种可行的解决方案:

方法一:使用ROW_NUMBER()分析函数(推荐)

这种方法能精准定位每个客户最早日期对应的那条收据记录,即使同一客户在同一天有多条收据,也只会返回其中一条(如果需要保留所有同一天的记录,可以把ROW_NUMBER()换成RANK()):

SELECT 
    cmp_numero AS RECEIPT_ID,
    cli_codigo AS CLIENT_ID,
    cmp_fecha_contable AS RECEIPT_DATE
FROM (
    SELECT 
        cmp_numero,
        cli_codigo,
        cmp_fecha_contable,
        -- 按客户分组,每组内按日期升序排序,标记第一条为1
        ROW_NUMBER() OVER (PARTITION BY cli_codigo ORDER BY cmp_fecha_contable ASC) AS rn
    FROM comprobantes
    WHERE cli_codigo IS NOT NULL
) t
WHERE rn = 1 -- 筛选每个客户的第一条记录
ORDER BY CLIENT_ID ASC;

方法二:子查询关联MIN日期

如果你的业务场景中,每个客户的最早日期只会对应一条收据,也可以用这种关联子查询的方式:

SELECT 
    c.cmp_numero AS RECEIPT_ID,
    c.cli_codigo AS CLIENT_ID,
    c.cmp_fecha_contable AS RECEIPT_DATE
FROM comprobantes c
-- 关联子查询得到每个客户的最早收据日期
JOIN (
    SELECT 
        cli_codigo,
        MIN(cmp_fecha_contable) AS min_receipt_date
    FROM comprobantes
    WHERE cli_codigo IS NOT NULL
    GROUP BY cli_codigo
) t ON c.cli_codigo = t.cli_codigo AND c.cmp_fecha_contable = t.min_receipt_date
ORDER BY c.cli_codigo ASC;

注意事项

  • 替换cmp_numero为你实际的收据ID字段名(根据你的输出示例,这个字段应该就是对应RECEIPT_ID的字段)
  • 如果同一客户在最早日期有多条收据,方法二会返回所有符合条件的记录,而方法一默认只返回一条(可通过替换分析函数调整)

内容的提问来源于stack exchange,提问作者Young Al Capone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:58:35