2016-05-27 6 views
0

特定のIDに対して列の値が増減した回数をカウントするのに役立つ必要があります。sql oracle列の値が増加する方法

私はこの

ID Month Value1 
1 1 500 
1 2 500 
1 3 500 
1 4 1000 
2 1 1000 
2 2 500 
2 3 500 
2 4 1000 
3 1 6000 
3 2 6000 
3 3 5000 
3 4 5000 

のように見え、私はこの

ID Increases Decreases 
1 1 0 
2 1 1 
3 0 1 

はありがとうたいデータを持っています!

+0

が任意の月のギャップがあること、またはidの数ヶ月を複製することはできますか? – jarlh

+4

これは、使用しているデータベースエンジンによって大きく異なります。あなたの質問にデータベースエンジンを付けてください。 – trincot

+1

SQL Serverの場合は、ラグ関数 – apomene

答えて

1

lead関数を使用して計算列を作成し、次の行から値を取得します。次に、計算された列に基づいて集計します。ここで

select id, 
count(case when inc_or_dec = 'increase' then 1 end) increases, 
count(case when inc_or_dec = 'decrease' then 1 end) decreases 
from (
select id, 
case 
when coalesce(lead(value1) over(partition by id order by mth),value1) > value1 then 'increase' 
when coalesce(lead(value1) over(partition by id order by mth),value1) < value1 then 'decrease' 
when coalesce(lead(value1) over(partition by id order by mth),value1) = value1 then 'no change' 
end inc_or_dec 
from tablename) t 
group by id 
0

lagウィンドウ集計関数に基づくソリューションです:

SELECT id, 
     count(CASE WHEN value > prev_value THEN 1 END) Increases, 
     count(CASE WHEN value < prev_value THEN 1 END) Decreases 
FROM  (SELECT id, 
       month, 
       value, 
       lag(value) OVER (PARTITION BY id ORDER BY month) AS prev_value 
      FROM mytable) 
GROUP BY id 

あなただけの内側のクエリを実行した場合、あなたはそれが各電流値の次の以前の値を置く方法を見ることができます記録。唯一の楽しみのために

1

;)sign機能付:

SELECT id, SUM (SIGN (di + 1)) incCount, SUM (SIGN (di - 1)*-1) decCount 
    FROM (SELECT id, SIGN (LEAD (value1, 1) OVER (PARTITION BY id ORDER BY id, month) - value1) di FROM TABLENAME) 
    WHERE di <> 0 
GROUP BY id 
関連する問題