0

私は2つのテーブルを持っています

Product table
productid   int
productname varchar(32)

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

私はたくさんのレコードを持っています。いくつかの製品には重複する effectivedt があります。私がやりたいことは、レコードごとに重複する effectivedt を見つけ、最も長く実行されているものだけを保持することです。

私はしばらくそれをやろうとしてきましたが、これまでに何の運もありませんでした.

私は最も早い日付を見つけようと試みましたが、重複が最も古い日付ではない可能性があるため、うまくいかないことに気付きました

where または having または on 句でそれを使用できないため、effectivedt と inactivedt の違いを取得する方法を見つけることができません

だから、私は長い間努力してきましたが、何の助けも得られず、感謝の気持ちで泣くことができませんでした

よろしくお願いします

4

3 に答える 3

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、ORDERBYなどで使用できます。

于 2012-07-25T15:20:34.493 に答える
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 | の 1 つだけを保持する必要があります。2012-07-27

于 2012-07-27T21:38:00.300 に答える