我有这个简单的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.rowId
和t.colId
。问题是,如何删除此次事件的第二行?
答案 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