计算表列中的值更改

时间:2014-04-24 22:05:29

标签: sql sqlite

考虑一个排序表(根据id)。如何计算列中值的更改次数'?在以下示例中,更改次数为3(10到20,20到10,10到30)。 THX

id    value
 1      10
 2      10
 3      20
 4      20
 5      10
 6      30
 7      30

3 个答案:

答案 0 :(得分:4)

如果id是连续的,没有间隙......

Select count(*)
From table t1
   join table t2 
       on t2.id = t1.id + 1
where t2.value <> t1.value

其他......

Select count(*)
From table t1
   join table t2 
       on t2.id = (Select min(id)
                   From table 
                   where id > t1.id)
where t2.value <> t1.value

答案 1 :(得分:2)

您可以使用相关子查询来识别更改。然后加起来。当值与先前值不同时发生更改:

select count(*)
from (select t.*,
             (select value
              from table t2
              where t2.id < t.id
              order by t2.id desc
              limit 1
             ) as prev_value
      from table t
     ) t
where prev_value <> value;

请注意,由于第一行prev_valueNULL,因此忽略该行。

如果您可以保证id是连续的,没有间隙,您可以通过加入更有效地执行此操作:

select count(*)
from table t join
     table tprev
     on t.id = tprev.id + 1
where t.value <> tprev.value;

答案 2 :(得分:0)

我喜欢使用这个函数:lead()over()。例如,如果你有这个选择:

select id, value
from youTable
where id <= 7

我找到&#34;值&#34;的下一个值带有lead()函数的列,我与当前的列进行比较:

select count(1) as number from
   (select lead(value) over(order by id) as nextValue, id, value
    from youTable
    where id <= 7) as tmp
where tmp.nextValue <> tmp.value

现在,在数字中我将值的更改数字转换为&#34;值&#34;柱