请求修正SQL查询:获取2021年每周活动量Top3的所有者列表
修正SQL以获取2021年每周活动量Top3所有者列表
需求说明
- 目标:获取2021年每周活动量最多的前3位所有者列表
- 强制使用函数:
TOP、GROUP BY、COUNT、日期转周数、ROW_NUMBER - 输出字段:
Week Number、OwnerId、OwnerIdName、Count - 每周起始规则:周一(非周日)
原代码问题分析
- 全局
TOP(3)仅返回全表前3条记录,无法实现每周取前3的需求 DATEPART(week, ...)默认以周日为一周起始,不符合周一的规则- 日期范围计算逻辑错误,无法完整覆盖2021年所有周
- 窗口函数直接在聚合查询中输出,未利用排名结果进行筛选
修正后的SQL代码
-- 定义2021年的起止日期,确保覆盖全年 DECLARE @startDate DATE = '2021-01-01'; DECLARE @endDate DATE = '2021-12-31'; -- 第一步:计算每周每个所有者的活动量 WITH WeeklyActivityCounts AS ( SELECT -- 使用ISO周标准,确保周一为一周第一天 DATEPART(iso_week, a.ModifiedOn) AS [Week Number], a.OwnerId, a.OwneridName, COUNT(a.ActivityId) AS [Count] FROM ActivityPointer AS a WHERE a.ModifiedOn BETWEEN @startDate AND @endDate AND a.ActivityTypeCode IN ('4201','4210','4212') AND a.OwnerId IN( '3C696B18-BFF4-E911-A68A-005056A18C45', 'DDD1597F-4FCD-E411-80D3-0050568973A1', '0AD3654A-7517-E011-B418-00505689002A', '98FA2C51-A296-EB11-A6AD-005056A18C45', '56C940A2-B396-EB11-A6AD-005056A18C45', '379C0CE5-D3D2-E911-8105-02BF0A0AC819' ) GROUP BY DATEPART(iso_week, a.ModifiedOn), a.OwnerId, a.OwneridName ), -- 第二步:对每周的活动量进行排名 RankedActivity AS ( SELECT [Week Number], OwnerId, OwneridName, [Count], -- 按周分区,活动量降序排名 ROW_NUMBER() OVER (PARTITION BY [Week Number] ORDER BY [Count] DESC) AS Rank FROM WeeklyActivityCounts ) -- 第三步:筛选每周排名前3的记录 SELECT [Week Number], OwnerId, OwneridName, [Count] FROM RankedActivity WHERE Rank <= 3 ORDER BY [Week Number], Rank;
修正要点说明
- 周数计算:使用
DATEPART(iso_week, ...)遵循ISO标准,强制周一为一周起始日 - 逻辑拆分:用CTE将"统计活动量"和"排名筛选"拆分为两步,可读性更强
- 每周Top3实现:通过
ROW_NUMBER()按周分区排名,再筛选Rank <=3,实现每周取前3的需求 - 日期范围优化:直接定义2021年起止日期,避免原代码中复杂且错误的日期偏移计算
内容的提问来源于stack exchange,提问作者qwatro_
相关产品推荐
相关产品推荐

