0

我有两张桌子

Product table
productid   int
productname varchar(32)

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

我有一堆记录有些产品有重复的有效dt 我想要做的是为每条记录找到重复的有效dt 并且只保留运行时间最长的无效dt 也是一个日期所以长度将从有效dt 到无效dt

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

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

我找不到一种方法来区分 Effectivedt 和 inactivedt,因为我无法在 where 或 have 或 on 子句中使用它

所以你们我已经尝试了很长时间,但无济于事任何帮助都会让我感激不尽

提前谢谢你

4

3 回答 3

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-27T21:38:00.300 回答
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
于 2012-07-25T16:05:44.107 回答
0

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

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

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

于 2012-07-25T15:20:34.493 回答