2017-05-12 5 views
-5

私はart_id,datepriceの3つの列を持つSQL Server 2008テーブルを持っています。時々、価格が変化します。日付は連続していません。SQL Server 2008:日付と価格の変更を計算します

価格が変更された日時と、どれくらい毎回、art_idについて計算することができますか?

+2

いくつかのデータサンプルを追加して、結果を期待。また、これまでに何を試しましたか?実際の価格と直近の直前価格が必要ですか?どのように価格が変わる?このテーブルの新しいレコードか、まさに更新ですか? – Horaciux

答えて

1

のような何か:

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; 
+0

これは完璧なソリューションのように見えますが、問題は私がSQL 2008であることです。それを前もって言及してくれないのは残念です。 – Milan

+0

LAGまたはLEADを使わずに解決策を組み込むように私のソリューションを更新しました –

1

自己を使用してくださいあなたは2012+またはCTEと窓関数ROW_NUMBER()を使用している場合は、この結果セットを使用すると、LEADLAGを使用して価格変動を計算することができ、その後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 

に参加します。より明確にする必要がある場合は、使用しているバージョンを指定してください。

+0

返信いただきありがとうございます。私はSQL 2008上で、ラグやリードを使用することはできません。 – Milan

関連する問題