SQL Server:根据2列删除重复项

时间:2016-09-27 11:33:33

标签: sql sql-server

我有这个简单的SQL查询

SELECT 
    t.rowId, t.colid,
    CONVERT(VARCHAR(5), [Datetime], 108) [Datetime] 
FROM
    Events e 
INNER JOIN
    tempEvent t ON e.employeeid = t.kodp 
                AND CAST(e.[datetime] AS DATE) = t.data 
WHERE 
    ControlPointid IN (SELECT ControlPointID 
                       FROM ControlPoints 
                       WHERE Name LIKE '%POR%') 
    AND EventTypeId = 1 
    AND EmployeeId = 504;

以下是结果:

rowId   colid   Datetime
-------------------------
32        7      06:53
32        13     06:56
32        14     06:53
32        17     06:51
32        17     10:50
32        18     06:50
32        19     06:48
32        10     06:50
32        20     06:51

如您所见,有两行具有相同的t.rowIdt.colId。问题是,如何删除此次事件的第二行?

2 个答案:

答案 0 :(得分:2)

一种方法是使用聚合,但您需要决定要保留哪些值:删除第二个当前使用Min而不是Max。

select t.rowId, t.colid,
       min(convert(varchar(5), [Datetime], 108)) as [Datetime] 
from Events e inner join
     tempEvent t 
     on e.employeeid = t.kodp and
        cast(e.[datetime] as date) = t.data 
where ControlPointid in (select ControlPointID
                         from ControlPoints
                         where Name like '%POR%'
                        ) and
      EventTypeId = 1 And EmployeeId = 504
group by t.rowId, t.colid;

答案 1 :(得分:1)

使用CTE,您可以按t.rowId ,t.colid分组并获得预期结果:

;WITH ResultData AS (
    SELECT  t.rowId, t.colid, CONVERT(VARCHAR(5), [Datetime], 108) [Datetime],
            ROW_NUMBER() OVER (PARTITION BY t.rowId, t.colid ORDER BY CONVERT(VARCHAR(5), [Datetime], 108) ASC) RowNumber
    FROM Events e
    INNER JOIN tempEvent t ON e.employeeid = t.kodp AND cast(e.[datetime] AS DATE) = t.data
    WHERE ControlPointid IN (SELECT ControlPointID FROM ControlPoints WHERE NAME LIKE '%POR%' )
        AND EventTypeId = 1 AND EmployeeId = 504
)
SELECT rowId, colid, [Datetime]
FROM ResultData
WHERE RowNumber = 1