繁体   English   中英

SQL中保留较高值并删除较低值

[英]Retaining higher value and deleting lower value in SQL

新年快乐。

我不确定如何执行 SQL ,我需要保留最高级别的 clientID 记录,同时删除其他记录?

我的表如下

桌子

并想在下面

在此处输入图像描述

基本上,它删除了重复的 clientID 行,但保留了该 clientID 记录的最高级别。

感谢您的任何指导。

此查询适用于 SQL 的大多数变体(不是 MySQL < 8.0 或 SQL 服务器); 它使用ROW_NUMBER()ClientIDLevel值进行排名,并删除除具有该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
)

dbfiddle 上的 SQLite 演示

在 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

dbfiddle 上的演示

在 MySQL < 8.0 中,您可以使用此查询:

DELETE FROM data
WHERE (ClientID, Level) NOT IN (
  SELECT ClientID, MAX(Level)
  FROM (SELECT * FROM data) d
  GROUP BY ClientID
)

dbfiddle 上的演示

您可以按如下方式使用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)

Mysql ,您可以简单地访问所需的 output 而无需删除 sql 中的数据

SELECT ClientID,level FROM (SELECT* , ROW_NUMBER() OVER(PARTITION BY ClientID 
ORDER BY level DESC ) AS RN FROM tbl_client)A
WHERE RN=1

这是简单的 Desired output

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM