2016-09-27 87 views
1

我有這個簡單的SQL查詢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。問題是,如何刪除這個事件的第二行?

+0

是'MySQL'或'SQL-Server'? – Arulkumar

+0

@Arulkumar這是SQL服務器。添加mysql標籤是一個missclick。 – fanarek

回答

2

一種方法是使用聚合,但您需要決定要保留的值:要刪除第二次使用最小值而不是最大值。

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; 
+0

@Deepak Sharma它很棒。謝謝。 – fanarek

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 
+0

您不應該查找RowNumber> 1,因爲這些是您想要刪除的行嗎? (或申請不在...) – Jens

+0

@jens實際上用戶想要從他的選擇查詢刪除行:-) –

+0

@Arulkumar你的方式也可以。感謝您的回答。 – fanarek