T-sql在日期处于相同的月份和年份时查找重复记录
T-sql在日期处于相同的月份和年份时查找重复记录
我想写一个T-SQL语句,当日期匹配到相同的月份和年份时,找到重复记录。\n我已经在Ms Access中找到了如果日期完全相同的重复记录,使用以下代码:\n
SELECT First(dbo_T_TrainingMandatory.StaffID) AS [StaffID字段], First(dbo_T_TrainingMandatory.TrainingCourseID) AS [TrainingCourseID字段], First(dbo_T_TrainingMandatory.DateTrained) AS [DateTrained字段], COUNT(dbo_T_TrainingMandatory.StaffID) AS 重复次数 FROM dbo_T_TrainingMandatory GROUP BY dbo_T_TrainingMandatory.StaffID, dbo_T_TrainingMandatory.TrainingCourseID, dbo_T_TrainingMandatory.DateTrained HAVING (((COUNT(dbo_T_TrainingMandatory.StaffID)) > 1) AND ((COUNT(dbo_T_TrainingMandatory.DateTrained)) > 1));
\n但是当月份的日期不同的时候,还没有找到解决方案。
问题的出现原因是,当日期在同一个月和年份时,查找重复记录时,会出现重复的日期,导致结果中出现了大量的重复行。
解决方法是使用T-SQL查询,使用CTE(公共表表达式)和窗口函数来查找重复记录。下面是解决方法的详细步骤:
1. 在查询中使用CTE(公共表表达式)来创建临时表cte,其中包括StaffId(员工ID)、DateTrained(培训日期)和rn(行号)列。
2. 使用窗口函数row_number() over(partition by month(DateTrained), year(DateTrained) order by DateTrained)来为每个月和年份的日期进行编号。
3. 在查询结果中选择StaffId和DateTrained列,并使用WHERE子句过滤出行号(rn)大于1的记录,即重复记录。
以下是完整的T-SQL查询代码:
; with cte as ( SELECT StaffId,DateTrained, row_number() over (partition by month(DateTrained), year(DateTrained) order by DateTrained) as rn from tablename ) select staffId, DateTrained from cte where rn > 1
通过执行上述查询,您将获得StaffId和DateTrained列中的重复记录。这样,您就可以找到在同一个月和年份中出现重复日期的记录。
问题出现的原因是现有的方法已经过时,需要找到在相同的月份和年份下存在重复记录的方法。
解决方法是使用以下T-SQL代码:
;WITH myCTE ([StaffID Field],[TrainingCourseID Field],[DateTrained Field],[NumberOfDups]) AS ( SELECT StaffID, TrainingCourseID, DateTrained, COUNT(2) OVER(PARTITION BY StaffID, TrainingCourseID, DATEPART(YY,DateTrained),DATEPART(MM,DateTrained)) FROM dbo_T_TrainingMandatory ) SELECT * FROM myCTE WHERE NumberOfDups>1
如果在数据中看到1900-01-01
,那意味着该日期为空。如果空日期是可接受的,但在此处要排除它们,请在CTE中添加WHERE DateTrained <> '' AND DateTrained IS NOT NULL
。
感谢你准确地找到了问题。