SQL删除重复项,保存某些列的最低值

时间:2015-07-09 19:49:19

标签: sql sql-server database

我一直在寻找答案,但找不到与这种特殊情况相同的东西。

所以我有一个表,我想从中删除重复项。

    __________________
   | JobNumber-String |
   | JobOp -   Number |
    ------------------

因此,这两个值的倍数,它们共同构成了行的关键。我希望保持所有不同的工作号码与最低的工作职位。我怎样才能做到这一点?我尝试了很多东西,主要是尝试min函数,但这似乎只适用于整个表而不仅仅是JobNumber集。谢谢!

5 个答案:

答案 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函数。

请查看https://msdn.microsoft.com/en-us/library/ms189461.aspx

答案 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);