2012-02-27 199 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