我花了一些时间寻找这种情况,发现许多情况已接近但我无法让它与我的情况一起工作。
为简化起见,我的TABLE t包含contact_id
和Code
contact_id Code
__________ ____
123456 100
123456 200
123456 300
987654 100
987654 200
654321 300
对于每个contact_id
,我想选择代码最高的行并删除其他行。我确实想出了一个select语句来显示我希望表格看起来像什么:
select distinct contact_id, MAX(code) OVER(Partition by contact_id) AS code
from t
基于上述,我的结果集是:
123456 300
987654 200
654321 300
如何删除除此select语句生成的行之外的所有行。我尝试使用NOT IN
子句,但这当然不支持多列。
答案 0 :(得分:1)
我会保存想要的行(在变量或其他内容中),然后删除整个表,然后将它们重新插入为新行。
答案 1 :(得分:1)
尝试类似:
with cte as
(
select *
, rownum = row_number() over (partition by contact_id order by code desc)
from t
)
delete cte
where rownum <> 1
答案 2 :(得分: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
但如果你有一对以上的contact_id + code
对每个contact_id会产生超过1行。
答案 3 :(得分: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;
小提琴here.