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

SQL Server:查询指定时段数据,同一客户同日仅保留最早记录

问题:获取指定时间段内客户每日最早记录的SQL查询修正

需求说明:
需要编写SQL查询,获取选定时间段内的所有记录;如果同一客户(cd_devedor)在同一天存在2条及以上记录,仅保留其中最早的那一条。涉及字段包括:

  • cd_devedor:客户编码(int类型)
  • dt_ocorrencia:记录日期(datetime类型)
  • cd_historico:记录编码(int类型)

现有代码仅能返回客户的最后一条记录,无法满足需求,原代码如下:

DECLARE @DATA1 AS DATETIME
SELECT @DATA1 = INFORMAR('INFORME DATA INICIAL',H,{DIA/HORA INICIAL})
DECLARE @DATA2 AS DATETIME
SELECT @DATA2 = INFORMAR('INFORME DATA FINAL',H,{DIA/HORA FINAL})

select Oco.CD_Credor, Dev.CD_devedor, r.Dt_Ocorrencia as Data, Oco.Cd_Historico,
from (
    SELECT cd_devedor, MAX(dt_ocorrencia) as dt_ocorrencia
    FROM OCORRENCIA
    group by cd_devedor
)r
inner join ocorrencia oco on oco.cd_devedor = r.cd_devedor and oco.dt_ocorrencia = r.dt_ocorrencia
inner join Devedor Dev on (Oco.Cd_Devedor = Dev.Cd_Devedor)
inner join Historico His on (Oco.Cd_Historico = His.Cd_Historico)
where (oco.Dt_Ocorrencia >= @DATA1) AND (oco.Dt_Ocorrencia <= @DATA2) and oco.cd_devedor = 237

修正后的SQL查询

DECLARE @DATA1 AS DATETIME
SELECT @DATA1 = INFORMAR('INFORME DATA INICIAL',H,{DIA/HORA INICIAL})
DECLARE @DATA2 AS DATETIME
SELECT @DATA2 = INFORMAR('INFORME DATA FINAL',H,{DIA/HORA FINAL})

SELECT Oco.CD_Credor, Dev.CD_devedor, r.Dt_Ocorrencia as Data, Oco.Cd_Historico
FROM (
    -- 按客户+日期分组,取每个客户当日最早的记录时间
    SELECT 
        cd_devedor,
        MIN(dt_ocorrencia) as dt_ocorrencia
    FROM OCORRENCIA
    WHERE dt_ocorrencia BETWEEN @DATA1 AND @DATA2
    GROUP BY cd_devedor, CAST(dt_ocorrencia AS DATE) -- 按客户和日期分组,确保是每日最早
) r
INNER JOIN ocorrencia oco 
    ON oco.cd_devedor = r.cd_devedor 
    AND oco.dt_ocorrencia = r.dt_ocorrencia
INNER JOIN Devedor Dev 
    ON Oco.Cd_Devedor = Dev.Cd_Devedor
INNER JOIN Historico His 
    ON Oco.Cd_Historico = His.Cd_Historico
-- 若需要查询特定客户,保留下面的条件;否则删除
WHERE oco.cd_devedor = 237

关键修改点说明

  1. 子查询逻辑调整:

    • 原代码用MAX(dt_ocorrencia)取的是客户在整个时间段内的最晚记录,现在改为MIN(dt_ocorrencia),并新增CAST(dt_ocorrencia AS DATE)作为分组字段,确保按客户+日期分组,取每个客户当日的最早记录。
    • 将时间段过滤条件移到子查询中,减少后续关联的数据量,提升查询效率。
  2. 语法修正:

    • 移除了原SELECT语句末尾多余的逗号,避免语法错误。
  3. 灵活性优化:

    • 保留了特定客户的过滤条件,可根据需求选择保留或删除,实现查询单个客户或所有客户的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:15:26