2011-11-08 18 views
3

2つの列(日付と価格)を持つ表があるとします。ある範囲の日付を選択すると、時間の経過とともに価格の変化の数を数える方法がありますか?例えばSQL - 順序付きリストの変更数をカウントする

:この場合

Date | Price 
22-Oct-11 | 3.20 
23-Oct-11 | 3.40 
24-Oct-11 | 3.40 
25-Oct-11 | 3.50 
26-Oct-11 | 3.40 
27-Oct-11 | 3.20 
28-Oct-11 | 3.20 

、私はそれが4つの価格変化の数を返すようにしたいと思います。

ありがとうございます。

答えて

5

を試してみてください。

SQL> ed 
Wrote file afiedt.buf 

    1 with t as (
    2 select date '2011-10-22' dt, 3.2 price from dual union all 
    3 select date '2011-10-23', 3.4 from dual union all 
    4 select date '2011-10-24', 3.4 from dual union all 
    5 select date '2011-10-25', 3.5 from dual union all 
    6 select date '2011-10-26', 3.4 from dual union all 
    7 select date '2011-10-27', 3.2 from dual union all 
    8 select date '2011-10-28', 3.2 from dual 
    9 ) 
10 select sum(is_change) 
11 from (
12  select dt, 
13    price, 
14    lag(price) over (order by dt) prior_price, 
15    (case when lag(price) over (order by dt) != price 
16     then 1 
17     else 0 
18    end) is_change 
19*  from t) 
SQL>/

SUM(IS_CHANGE) 
-------------- 
      4 
+0

印象的。ありがとうございました。 – Jama

0

あなたは、結果セットの前と次の行にアクセスし、変化があるかどうかを確認するためにそれを使用する分析関数LEADLAGを使用することができ、この

select count(*) 
from 
(select date,price from table where date between X and Y 
group by date,price) 
+3

のいずれかを使用するOracleのバージョンに応じて、変更。 10/23の3.2から3.4への変更は1つの変更であり、10/26の3.5から3.4への変更は第2の変更であるため、3つの異なる価格があっても4つの価格変更があります。しかし、あなたは 'PRICE'に加えて' DATE 'でグループ分けしているので、2つの日付(この場合は7)間の行を数え上げれば、日付ごとに1つの価格が仮定されます。 –

+0

良いキャッチは、私の悪いデータの例で同じ価格を気付かなかった.... – Sparky

0

分析機能(ジャスティン洞窟からの回答を参照)か、明確な価格の数ではない価格の数をカウントしようとしているように見えます。この

SELECT 
SUM (CASE WHEN PREVPRICE != PRICE THEN 1 ELSE 0 END) CNTCHANGES 
FROM 
(
SELECT 
C.DATE, 
C.PRICE, 
MAX (D.PRICE) PREVPRICE 
FROM 
(
SELECT 
A.Date, 
A.Price, 
(SELECT MAX (B.DATE) FROM MyTable B WHERE B.DATE < A.DATE) PrevDate 
FROM MyTable A 
WHERE A.DATE BETWEEN YourStartDate AND YourEndDate 
) C 
INNER JOIN MyTable D ON D.DATE = C.PREVDATE 
GROUP BY C.DATE, C.PRICE 
) 
関連する問題