如何避免重复值

时间:2012-02-27 08:30:51

标签: sql sql-server sql-server-2000

表1

ID  fromdate   todate

001 23/02/2012 27/02/2012
002 23/02/2012 27/02/2012
003 28/02/2012 09/09/2013
....

条件:我不想显示重复的值,所以从日期验证与其他日期相同,如果它相等则不应重复,到目前为止与其他日期验证,如果它等于那么日期不应该重复,

预期产出

ID  fromdate   todate

001 23/02/2012 27/02/2012
003 28/02/2012 09/09/2013
....

从上面的输出中,002没有显示,因为fromdate和todate与001相同,所以从最新的比较不应该重复。

如何为上述条件编写查询?

4 个答案:

答案 0 :(得分:4)

试试这个:

SELECT MIN(ID), fromDate, toDate FROM table
GROUP BY fromDate, toDate

答案 1 :(得分:2)

ROW_NUMBER解决方案更易于编写,但可以使用SQL Server 2000

简而言之

  • 在子选择中获得最低fromdates
  • 使用我们之前的子选择,通过todates获得剩余最低fromdates的子选择中的所有最低JOINING
  • 使用我们之前的子选项,通过todates获取剩余JOINING的实际表中的所有记录。

SQL声明

SELECT  Table1.*
FROM    Table1
        INNER JOIN (
          SELECT  ID = MIN(Table1.ID), todate
          FROM    Table1
                  INNER JOIN (
                    SELECT  ID = MIN(ID), fromdate
                    FROM    Table1
                    GROUP BY
                            fromdate
                  ) UniqueFromDates ON UniqueFromDates.ID = Table1.ID
          GROUP BY
                  todate        
        ) UniqueToDates ON UniqueToDates.ID = Table1.ID                  

答案 2 :(得分:1)

如果您要求“来自和迄今为止比较不应重复”是您的要求,那么非常简单

如果有多个“ID”具有相同的fromdata和todate且您想显示第一个ID ,请使用此

  select MIN(id) id,fromdata, todate from tablename group by fromdata, todate

如果有多个“ID”具有相同的fromdata和todate,并且您希望显示最后ID ,请使用此

  select MAX(id) id,fromdata, todate from tablename group by fromdata, todate

答案 3 :(得分:0)

您也可以使用PARTITION BY之类的↓

SELECT id,
       fromdate,
       todate
FROM   (SELECT id,
               fromdate,
               todate,
               Row_number() OVER (PARTITION BY fromdate, todate ORDER BY id) AS
               row
        FROM   table) t
WHERE  t.row = 1