我有两张桌子
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子句中获得它
因此,我们一直在努力寻找一个好长的时间,没有任何帮助可以让我感激地哭泣
提前感谢你
答案 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