2012-07-25 144 views
0

我有兩個表INNER JOIN,刪除重複

Product table 
productid int 
productname varchar(32) 

productprice table 
productid int 
effectiviedt date 
inactivedt date 
price  decimal (10,2) 

我有一大堆的記錄 部分產品已複製effectivedt 我想要做的是爲每個記錄 找到重複生效日期,並且只保留最長時間運行的一個不活動日期也是一個日期,因此該長度將形成對不活動日期的有效日期

我一直在嘗試做一段時間,但沒有運氣如此以往。

我開始試圖找到的最早日期,但認識不監守重複的工作可能不是最早的日期

我不能找到一個辦法讓effectivedt之間inactivedt因爲我不能有差異它在其中或有或條款

所以你們我一直沒有想好長好長WHI,電子無濟於事任何幫助將讓我有thankfullness哭

感謝您提前

+0

一對副本是否有完全相同的效果(當然是+ productid),或者您是否也想要找到重疊的區間? – wildplasser 2012-07-25 15:44:26

+0

他們也有超過圈數,但首先我想刪除任何重複,然後改變無效日期,以刪除超過圈 – 2012-07-25 15:55:38

回答

1

你可以約lculate日期差異在這樣德SELECT語句:

SELECT ..., DATEDIFF(effectivedt, inactivedt) as active_length, ... 

然後,您可以使用結果在WHERE,ORDER BY等

+0

謝謝,但我可以得到任何更多的幫助,因爲我真的開始失去意願 – 2012-07-25 15:44:09

0

簡單一模一樣的開始日期刪除,但被刪除的一個具有較早的停止日期。

DROP SCHEMA tmp CASCADE; 
CREATE SCHEMA tmp ; 
SET search_path=tmp; 
CREATE TABLE productprice 
     (id INTEGER NOT NULL 
     , startdate date 
     , stopdate date 
     , price  decimal (10,2) 
     ); 

INSERT INTO productprice(id,startdate,stopdate,price) VALUES 
(1, '2012-07-01', '2012-07-10', 10.0) 
,(1, '2012-07-01', '2012-07-01', 20.0) 
,(2, '2012-07-05', '2012-07-06', 30.0) 
,(2, '2012-07-05', '2012-07-10', 40.0) 
     ; 

DELETE FROM productprice de 
WHERE EXISTS (SELECT * 
     FROM productprice ex 
     WHERE ex.id=de.id 
     AND ex.startdate = de.startdate 
     AND ex.stopdate > de.stopdate 
     ) 
     ; 

SELECT * FROM productprice; 

結果:

CREATE TABLE 
INSERT 0 4 
DELETE 2 
id | startdate | stopdate | price 
----+------------+------------+------- 
    1 | 2012-07-01 | 2012-07-10 | 10.00 
    2 | 2012-07-05 | 2012-07-10 | 40.00 
+0

謝謝你工作得很好或多或少正是我想要的,唯一的問題是我只想保留一個記錄是兩個都是相同的例如,所以如果我有 – 2012-07-27 17:40:00

+0

謝謝你的作品很好或多或少正是我想要的,唯一的問題是我只想保留一個記錄是兩個是相同的例如,所以如果我有 2012-07-05 | 2012-07-10 2012-07-07 | 2012-07-25 2012-07-07 | 2012-07-27 2012-07-27 | 2012-07-32 它應該只保留2012-07-07 | 2012-07-27 – 2012-07-27 21:36:21

0

謝謝你工作得非常好或多或少正是我想要的,唯一的問題是,我只想保持一個記錄是兩個用於例如相同的,所以,如果我有

2012-07-05 | 2012-07-10 
2012-07-07 | 2012-07-25 
2012-07-07 | 2012-07-27 
2012-07-27 | 2012-07-32 

它應該只保留一個2012-07-07 | 2012-07-27