考虑一个排序表(根据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
答案 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_value
为NULL
,因此忽略该行。
如果您可以保证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;柱