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

使用窗口函数+DatePart按周末日期统计工单数量遇问题求助

按周统计工单数量的正确写法

原代码的问题

  • 主查询未做GROUP BY,会返回原表所有行,每行重复相同的统计值,完全不是分组统计的结果
  • 子查询没有关联主查询的周数,导致子查询返回全表所有周的统计数据,DISTINCT只能随机取其中一个,逻辑完全错误
  • 错误使用窗口函数:你需要的是分组聚合结果,窗口函数是给每行添加分组统计标记,这里用GROUP BY加聚合函数更直接
  • TotalClosed的条件写反了:要统计已关闭工单,应该用ticket_status IN ('Resolved', 'Closed'),而非NOT IN

正确实现代码

如果需求是按工单创建时间的周,统计该周新建工单总数,以及该周新建工单中已关闭的数量,用以下代码:

SELECT
    DATEPART(week, creation_date) AS WeekEnding,
    COUNT(ticket_id) AS TotalOpened, -- 该周新建的所有工单
    SUM(CASE WHEN ticket_status IN ('Resolved', 'Closed') THEN 1 ELSE 0 END) AS TotalClosed -- 该周新建且已关闭的工单
FROM data
GROUP BY DATEPART(week, creation_date)
ORDER BY WeekEnding;

如果需求是按工单关闭时间的周,统计该周关闭的工单总数(可额外加本周新建且关闭的数量):

SELECT
    DATEPART(week, close_date) AS WeekEnding,
    COUNT(ticket_id) AS TotalClosed, -- 该周关闭的所有工单
    COUNT(DISTINCT CASE WHEN DATEPART(week, creation_date) = DATEPART(week, close_date) THEN ticket_id END) AS TotalOpenedClosedSameWeek -- 本周新建且本周关闭的工单
FROM data
WHERE ticket_status IN ('Resolved', 'Closed')
GROUP BY DATEPART(week, close_date)
ORDER BY WeekEnding;

补充说明

  • 如果需要更准确的周范围(比如包含年份,避免跨年周重复),可以把DATEPART(week, creation_date)改成CONCAT(DATEPART(year, creation_date), '-W', DATEPART(iso_week, creation_date))作为周标识
  • 窗口函数适合在保留原表所有行的同时,添加分组统计字段(比如每行显示所在周的工单总数),但单纯分组统计用GROUP BY更高效简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:02:41