我一直在寻找答案,但找不到与这种特殊情况相同的东西。
所以我有一个表,我想从中删除重复项。
__________________
| JobNumber-String |
| JobOp - Number |
------------------
因此,这两个值的倍数,它们共同构成了行的关键。我希望保持所有不同的工作号码与最低的工作职位。我怎样才能做到这一点?我尝试了很多东西,主要是尝试min函数,但这似乎只适用于整个表而不仅仅是JobNumber集。谢谢!
答案 0 :(得分:1)
原始表值:
JobNumber Jobop
123 100
123 101
456 200
456 201
780 300
Code Ran:
DELETE FROM table
WHERE CONCAT(JobNumber,JobOp) NOT IN
(
SELECT CONCAT(JobNumber,MIN(JobOp))
FROM table
GROUP BY JobNumber
)
结束表值:
JobNumber Jobop
123 100
456 200
780 300
答案 1 :(得分:0)
使用SQL Server 2008或更高版本,您可以使用指定PARTITION BY部分的OVER子句来增强MIN函数。
答案 2 :(得分:0)
您只需选择要保留的值:
select jobOp, min(number) from table group by jobOp
然后你可以删除你不想要的记录:
DELETE t FROM table t
left JOIN (select jobOp, min(number) as minnumber from table group by jobOp ) e
ON t.jobob = e.jobob and t.number = e.minnumber
Where e.jobob is null
答案 3 :(得分:0)
我喜欢用窗口函数执行此操作:
with todelete as (
select t.*, min(jobop) over (partition by numbers) as minjop
from table t
)
delete from todelete
where jobop > minjop;
答案 4 :(得分:0)
使用MIN
函数时,您似乎没有使用正确的GROUP BY子句。这个sql应该为每个JobNumber提供最小的JobOp值:
SELECT JobNumber, MIN(JobOp) FROM test.so_test GROUP BY JobNumber;
在子查询中使用它,以及CONCAT
(这是来自MySQL,SQL Server可能使用不同的函数),因为这两个字段构成了你的密钥,给你这个sql:
SELECT * FROM so_test WHERE CONCAT(JobNumber,JobOp)
NOT IN (SELECT CONCAT(JobNumber,MIN(JobOp)) FROM test.so_test GROUP BY JobNumber);