T-sql在日期处于相同的月份和年份时查找重复记录

18 浏览
0 Comments

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但是当月份的日期不同的时候,还没有找到解决方案。

0
0 Comments

问题的出现原因是,当日期在同一个月和年份时,查找重复记录时,会出现重复的日期,导致结果中出现了大量的重复行。

解决方法是使用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列中的重复记录。这样,您就可以找到在同一个月和年份中出现重复日期的记录。

0
0 Comments

问题出现的原因是现有的方法已经过时,需要找到在相同的月份和年份下存在重复记录的方法。

解决方法是使用以下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

感谢你准确地找到了问题。

0