私はart_id
,date
とprice
の3つの列を持つSQL Server 2008テーブルを持っています。時々、価格が変化します。日付は連続していません。SQL Server 2008:日付と価格の変更を計算します
価格が変更された日時と、どれくらい毎回、art_id
について計算することができますか?
私はart_id
,date
とprice
の3つの列を持つSQL Server 2008テーブルを持っています。時々、価格が変化します。日付は連続していません。SQL Server 2008:日付と価格の変更を計算します
価格が変更された日時と、どれくらい毎回、art_id
について計算することができますか?
のような何か:
DECLARE @artSales TABLE (artid int, dt date, price money);
INSERT @artSales
VALUES
(1, '20170102', 10), (1, '20170108', 10), (1, '20170112', 8.50), (1, '20170115', 8.50),
(2, '20170102', 20), (2, '20170109', 20), (2, '20170112', 35), (2, '20170116', 40),
(3, '20170101', 500), (3, '20170111', 500), (3, '20170130', 500);
SELECT
artid,
dt,
oldPrice = price,
PriceChange =
CASE
LAG(price, 1, price) OVER (PARTITION BY artid ORDER BY dt)
WHEN price THEN 0 ELSE 1
END,
NewPrice = LAG(price, 1, price) OVER (PARTITION BY artid ORDER BY dt)
FROM @artSales;
結果:
artid dt oldPrice PriceChange NewPrice
----------- ---------- --------------------- ----------- ---------------------
1 2017-01-02 10.00 0 10.00
1 2017-01-08 10.00 0 10.00
1 2017-01-12 8.50 1 10.00
1 2017-01-15 8.50 0 8.50
2 2017-01-02 20.00 0 20.00
2 2017-01-09 20.00 0 20.00
2 2017-01-12 35.00 1 20.00
2 2017-01-16 40.00 1 35.00
3 2017-01-01 500.00 0 500.00
3 2017-01-11 500.00 0 500.00
3 2017-01-30 500.00 0 500.00
UPDATE - PRE-2012システムの場合:
WITH prev AS
(
SELECT rn = ROW_NUMBER() OVER (PARTITION BY artid ORDER BY dt), *
FROM @artSales
)
SELECT
as1.artid,
as1.dt,
OldPrice = as1.price,
PriceChange = CASE WHEN as1.price <> as2.price THEN 1 ELSE 0 END,
NewPrice = ISNULL(as2.price, as1.price)
FROM prev as1
LEFT JOIN prev as2 ON as1.artid = as2.artid AND as1.rn = as2.rn+1;
これは完璧なソリューションのように見えますが、問題は私がSQL 2008であることです。それを前もって言及してくれないのは残念です。 – Milan
LAGまたはLEADを使わずに解決策を組み込むように私のソリューションを更新しました –
自己を使用してくださいあなたは2012+またはCTE
と窓関数ROW_NUMBER()
を使用している場合は、この結果セットを使用すると、LEAD
かLAG
を使用して価格変動を計算することができ、その後MIN()
select
t.art_id,
,t.date
,t.price
from
yourTable t
inner join
(select art_id, price, min(date) dt
from yourTable
group by art_id, price) t2 on t2.dt = t.date and t2.art_id = t.art_id and t2.price = t.price
に参加します。より明確にする必要がある場合は、使用しているバージョンを指定してください。
返信いただきありがとうございます。私はSQL 2008上で、ラグやリードを使用することはできません。 – Milan
いくつかのデータサンプルを追加して、結果を期待。また、これまでに何を試しましたか?実際の価格と直近の直前価格が必要ですか?どのように価格が変わる?このテーブルの新しいレコードか、まさに更新ですか? – Horaciux