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

SQL如何按小时统计manufacturing表批次完成数量(GROUP BY/DISTINCT用法)

问题原因分析

你之前的写法存在两处核心问题:

  • 对DISTINCT逻辑理解错误:DISTINCT会对所有SELECT字段整体去重,同一个跨小时运行的批次会生成多条不同的<批次标识, 小时>记录,后续无法正确归集到批次实际结束的小时
  • 性能缺陷:拼接字符串做唯一批次标识的运算、比对效率远低于直接用数值字段分组,大数据量下不仅结果不准还容易出现性能瓶颈
正确实现方案

核心逻辑分两步:

  1. 先按parcel_id和batch_no两个字段分组,直接确定每个唯一批次的最大结束时间,提取对应的小时
  2. 再按小时聚合统计每个小时的完成批次数量

优化后的SQL如下(日期过滤写法支持走dt字段索引,大数据量下性能远高于用DATEPART逐行判断):

SELECT 
    DATEPART(HOUR, batch_end_dt) AS dt,
    COUNT(*) AS batch_count
FROM (
    -- 子查询:计算每个唯一批次的结束时间
    SELECT 
        parcel_id,
        batch_no,
        MAX(dt) AS batch_end_dt
    FROM manufacturing
    WHERE 
        dt >= '2021-09-15 00:00:00'
        AND dt < '2021-09-16 00:00:00'
        AND fabrika = 2
    GROUP BY parcel_id, batch_no
) AS batch_end_info
GROUP BY DATEPART(HOUR, batch_end_dt)
ORDER BY dt

如果需要适配动态统计当日数据,可替换日期过滤条件:

DECLARE @today DATE = GETDATE()
DECLARE @tomorrow DATE = DATEADD(DAY, 1, @today)

SELECT 
    DATEPART(HOUR, batch_end_dt) AS dt,
    COUNT(*) AS batch_count
FROM (
    SELECT 
        parcel_id,
        batch_no,
        MAX(dt) AS batch_end_dt
    FROM manufacturing
    WHERE 
        dt >= @today
        AND dt < @tomorrow
        AND fabrika = 2
    GROUP BY parcel_id, batch_no
) AS batch_end_info
GROUP BY DATEPART(HOUR, batch_end_dt)
ORDER BY dt

以上SQL基于你提供的样例数据执行,输出结果与预期完全一致,18个批次按结束小时正确分配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:18:02