3列のテーブルがあります
+--------------+-------------------------+------- + | | インストゥルメント ID | 日付 | 価格 | +--------------+-------------------------+------- + | | 39 | 2012-10-31 00:00:00.000 | 150 | | | 39 | 2012-11-01 00:00:00.000 | 160 | | | 39 | 2012-11-01 00:00:00.000 | 200 | | | 40 | 2012-10-31 00:00:00.000 | 150 | | | 40 | 2012-11-01 00:00:00.000 | 140 | | | 40 | 2012-11-01 00:00:00.000 | 200 | | | 50 | 2012-10-31 00:00:00.000 | 150 | | | 50 | 2012-11-01 00:00:00.000 | 150 | | | 50 | 2012-11-01 00:00:00.000 | 150 | +--------------+-------------------------+------- +
次の結果を受け取る必要があります:
+--------------+-------+ | | インストゥルメント ID | 価格 | +--------------+-------+ | | 39 | 200 | | | 40 | 0 | | | 50 | 150 | +--------------+-------+
ルール: 同じ InstrumentId の価格が上昇している、または等しい場合 => 最後の価格を返します (つまり、次のすべての価格が前の価格より大きいか等しいことを意味します。たとえば、ID 39: 150 <= 160 <= 200 => 200 を返します) ある場合同じ InstrumentId の価格が以前よりも小さい => 0 を返す (instrumentId 40 を参照)
カーソルでそれを行うことができます...しかし、これを行うための単純な回避策が存在すると思います。何か案は?
テストデータ:
DECLARE @table TABLE(
instrumentId INT NOT NULL,
priceListDate DATETIME NOT NULL,
price DECIMAL NOT NULL
)
INSERT INTO @table
(
instrumentId,
priceListDate,
price
)
VALUES( 39, '2012-10-31 00:00:00.000', 150),
(39,'2012-11-01 00:00:00.000', 160),
(39,'2012-11-01 00:00:00.000', 200),
(40,'2012-10-31 00:00:00.000', 150),
(40,'2012-11-01 00:00:00.000', 140),
(40,'2012-11-01 00:00:00.000', 200),
(50,'2012-10-31 00:00:00.000', 150),
(50,'2012-11-01 00:00:00.000', 150),
(50,'2012-11-01 00:00:00.000', 150)