SQL去重,保存特定列的最低值

3

我一直在寻找答案,但是没有找到任何与这个特定情况相同的东西。

因此,我有一个表格,我想要去除重复项。

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

因此,这两个值有多个,它们一起组成行的键。我想保留所有具有最低作业序列的不同作业编号。我该如何做到这一点?我尝试过很多方法,主要是使用min函数,但这似乎只适用于整个表而不仅仅是JobNumber集合。谢谢!

5个回答

2

原始表格数值:

JobNumber   Jobop
123          100
123          101
456          200
456          201
780          300

代码运行:

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

太好了,这个方法可行,谢谢。我之前不知道可以新建一个键。至少在 SQL Server 2008 中,只需要在值之间加上加号即可。 - Stampede10343

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

数字是一种类型,例如20或10。此外,您的答案与工作编号无关。 - Stampede10343

0

我喜欢使用窗口函数来完成这个任务:

with todelete as (
      select t.*, min(jobop) over (partition by numbers) as minjop
      from table t
     )
delete from todelete
    where jobop > minjop;

实际上,由于可能存在两个具有相同最小值的记录,因此这种方法可能无法删除重复项。最好使用ROW_NUMBER() OVER (Partition by numbers ORDER BY jobs) AS RowNum,并删除所有没有1的行,如下所示: with todelete as ( select t.*, ROW_NUMBER() over (partition by numbers order by jobop) as rownum from table t ) delete from todelete where rownum > 1; - Joseph Gagliardo
@JosephGagliardo . . . 请仔细阅读问题:“因此,这两个值的倍数是一起构成该行的密钥。” 这意味着没有重复。 - Gordon Linoff
很好,这并不是显而易见的。所以在这种情况下,min函数可以正常工作。尽管如此,如果情况不同,考虑使用Row_Number也是一个很好的建议。 - Joseph Gagliardo

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

谢谢,这个方法有效。另一个答案更为详细,但还是感谢您! - Stampede10343

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接