[英]Retaining higher value and deleting lower value in SQL
此查询适用于 SQL 的大多数变体(不是 MySQL < 8.0 或 SQL 服务器); 它使用ROW_NUMBER()
按ClientID
对Level
值进行排名,并删除除具有该ClientID
值的最大Level
的行之外的所有行:
WITH CTE AS (
SELECT ClientID, Level,
ROW_NUMBER() OVER (PARTITION BY ClientID ORDER BY Level DESC) AS rn
FROM data
)
DELETE FROM data
WHERE (ClientId, Level) IN (
SELECT ClientId, Level
FROM CTE
WHERE rn > 1
)
在 SQL 服务器中,您可以简单地从 CTE 中删除:
WITH CTE AS (
SELECT ClientID, Level,
ROW_NUMBER() OVER (PARTITION BY ClientID ORDER BY Level DESC) AS rn
FROM data
)
DELETE FROM CTE
WHERE rn > 1
在 MySQL < 8.0 中,您可以使用此查询:
DELETE FROM data
WHERE (ClientID, Level) NOT IN (
SELECT ClientID, MAX(Level)
FROM (SELECT * FROM data) d
GROUP BY ClientID
)
您可以按如下方式使用exists
:
Delete from your_table t
Where exists
(Select 1 from your_table tt
Where tt.client_id = t.client_id and tt.level > t.level)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.