2

我花了一些时间寻找这种情况,发现很多情况很接近,但我无法让它适应我的情况。

为了简化,我有 TABLE tcontact_idCode

contact_id           Code
__________           ____
123456                100
123456                200
123456                300
987654                100
987654                200
654321                300

对于每个contact_id我想选择代码最高的行并删除其他行。我确实提出了一个选择语句来显示我希望表格看起来像什么:

select distinct contact_id, MAX(code) OVER(Partition by contact_id) AS code
from t

基于以上,我的结果集是:

123456                300
987654                200
654321                300

如何删除除此 select 语句生成的行之外的所有行。我尝试使用NOT IN子句,但这当然不支持多列。

4

4 回答 4

1

尝试类似:

with cte as
(
  select *
    , rownum = row_number() over (partition by contact_id order by code desc)
  from t
)
delete cte
where rownum <> 1

SQL Fiddle 与演示

于 2013-08-26T23:30:03.020 回答
1

尝试这个:

DELETE atable
FROM atable at
INNER JOIN (    
   SELECT contact_id, code = MAX(code)
   FROM atable
   GROUP BY contact_id
) q ON at.contact_id = q.contact_id AND at.code < q.code

但是,如果您有超过 1 行,则contact_id + code每个contact_id 将产生超过 1 行。

于 2013-08-26T23:45:44.367 回答
1

我会保存想要的行(在变量或其他东西中),然后删除整个表,然后将它们重新插入为新行。

于 2013-08-26T23:27:10.760 回答
0

没有 CTE 也没有子查询:

DELETE t1 FROM t t1
LEFT OUTER JOIN t t2
ON t1.contact_id = t2.contact_id AND t1.code < t2.code
WHERE t2.code IS NOT NULL;

在这里拉小提琴

于 2013-08-26T23:54:54.917 回答