INNER JOIN,重复删除

时间:2012-07-25 15:14:23

标签: mysql date duplicates inner-join duplicate-removal

我有两张桌子

Product table
productid   int
productname varchar(32)

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

我有一堆记录 有些产品有重复的有效性 我想要做的是每个记录 找到重复的有效值并且只保留最长的运行的一个,inactivedt也是一个日期,所以长度将形成有效的dbd到

我一直在尝试这样做,但却一直没有运气。

我开始尝试在最早的日期找到,但意识到这不起作用,因为重复可能不是最早的日期

我无法找到一种方法来获取effectivedt和inactivedt之间的区别,因为我无法在where或having或on子句中获得它

因此,我们一直在努力寻找一个好长的时间,没有任何帮助可以让我感激地哭泣

提前感谢你

3 个答案:

答案 0 :(得分:0)

您可以像这样计算SELECT语句中的日期差异:

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

然后,您可以在WHERE,ORDER BY等中使用结果

答案 1 :(得分:0)

使用完全相同的startdate进行简单删除,但删除的具有较早的stopdate。

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

答案 2 :(得分: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