Sql 使用分组依据和聚合条件删除

Sql 使用分组依据和聚合条件删除,sql,sql-server,Sql,Sql Server,我有一个包含外键和日期时间戳的表。我想删除时间戳晚于最终时间戳当天开始的所有行,但要分别删除每个项目 从逻辑上讲,我想要这样的东西: DELETE FROM Entries WHERE StartTime > CONVERT(Date,MAX(StartTime)) GROUP BY ItemId; 但是我不能在DELETE中使用GROUP BY,也不能在WHERE条件中使用SUM() 我可以使用如下子查询一次删除一项: DELETE FROM Entries WHERE It

我有一个包含外键和日期时间戳的表。我想删除时间戳晚于最终时间戳当天开始的所有行,但要分别删除每个项目

从逻辑上讲,我想要这样的东西:

 DELETE FROM Entries
 WHERE StartTime > CONVERT(Date,MAX(StartTime))
 GROUP BY ItemId;
但是我不能在DELETE中使用GROUP BY,也不能在WHERE条件中使用SUM()

我可以使用如下子查询一次删除一项:

 DELETE FROM Entries
 WHERE ItemId=@Id
 AND StartTime > (
   SELECT CONVERT(Date,MAX(StartTime)) FROM Entries
   WHERE ItemId=@Id
 )

但我想删除单个查询中所有项目的。如何实现这一点?

对于您的查询,您可以使用

 DELETE FROM E
 FROM Entries E JOIN (
 SELECT ItemId, MAX(StartTime) st from Entries GROUP BY ItemId)E2
 ON E.ItemId=E2.ItemId 
 WHERE E.StartTime > CONVERT(Date,E2.st)

您可以将查询重写为不使用
@Id

DELETE e
FROM Entries AS e
WHERE StartTime > (
   SELECT CONVERT(Date,MAX(StartTime)) FROM Entries ee
   WHERE ee.ItemId=e.Id
)

@DasBinkenLight,但我想删除多个ItemID。我上面的查询只处理一个ItemId,对每个项目分别应用时间戳检查。我上面的查询一次只处理一个ItemId。没关系,我错过了您查询中的
@Id
参数。我编辑了你的查询,使之成为我在键入上一条评论时所认为的内容。