sql oracle如何计算列中的值增加

时间:2016-05-27 13:49:13

标签: sql oracle

我需要帮助计算列值增加和减少特定ID的次数。

我的数据看起来像这样

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  

谢谢!

3 个答案:

答案 0 :(得分:1)

使用<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" > <LinearLayout android:id="@+id/wrapper" android:layout_width="fill_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/imgPhotoSendVC" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="5dip" android:paddingLeft="10dip" android:visibility="gone"/> <TextView android:id="@+id/comment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="5dip" android:paddingLeft="10dip" android:text="Mensaje Chat" android:textColor="@android:color/primary_text_light" android:textSize="15dp" android:textStyle="normal" /> <ProgressBar style="?android:attr/progressBarStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/progressBarEnvioFoto" android:visibility="gone"/> </LinearLayout> </LinearLayout> 函数创建计算列,该函数从下一行获取值。然后根据计算的列汇总。

lead

答案 1 :(得分: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

答案 2 :(得分: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

如果你只是运行内部查询,你可以看到它如何将前一个值放在每个记录的当前值旁边。