2012-02-27 177 views
0

表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是不是showi因为fromdate和todate与001是一样的,所以从现在开始到现在的比较都不应该重复。

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

+0

从和日期比较不应重复.... – JetJack 2012-02-27 08:39:09

+0

你应该更清楚地解释你通过重复的意思。可能需要添加更多示例数据和预期输出。你还应该添加你尝试过的查询。 – 2012-02-27 08:40:47

+0

使用GROUP BY语句 – 2012-02-27 08:41:07

回答

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     
4

试试这个:

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

如果你遗漏MIN,会发生什么? – 2012-02-27 08:45:02

+0

身份证会有所不同,所以我不能使min(id)... – JetJack 2012-02-27 08:49:09

+0

@MicSim:这将适用于测试数据,但不符合OP的要求。如果两个日期中的一个**不是唯一的,则不应重复。将“27/02/2012”中的一个更改为“2012年2月26日”,您将获得三条记录,而不是所需的两条记录。 – 2012-02-27 09:01:05

1
从您的意见

如果“从和日期比较不应重复”是你的要求,它非常简单

如果有多个“ID” s的同fromdata和todate和要显示第一个ID然后用这个

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

如果有多个“ID” s的SA我fromdata和todate和要显示最后一个ID然后用这个

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

ID会有些不同,所以我不能够使min(id)... – JetJack 2012-02-27 08:48:47

+0

这将返回3条记录,但OP要2条。 – 2012-02-27 08:50:00

+0

添加更多示例数据然后我们可以给出正确的查询,而不是基于假设的查询 – 2012-02-27 08:50:54

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 
+0

,即使这是ASK的要求,这将不会在SQL Server 2000中工作(每个标签,他希望在MSSQL2K) – 2012-02-27 10:08:04

+0

@Noob AS Three Developer OH!很抱歉,我没有注意到标签! – shenhengbin 2012-02-27 10:18:06