我有一个SQLite .db文件,其中包含如下所示的Thread表:
ThreadID ClusterID
1 0
2 0
3 0
4 1
5 1
6 0
7 1
8 1
9 0
10 1
我想通过附近的行对GROUP BY进行GROUP BY。输出将是:
ThreadID ClusterID
1 0
4 1
6 0
7 1
9 0
10 1
理想情况下:
ThreadID ClusterID ClusterSwitch
1 0 NO
2 0 NO
3 0 NO
4 1 YES
5 1 NO
6 0 YES
7 1 YES
8 1 NO
9 0 YES
10 1 YES
整个设计用于检测集群何时从0切换到1以及从1切换到0
感谢您的帮助,非常感谢:) -Steve
答案 0 :(得分:1)
假设您的线程ID实际上没有间隙,您可以使用自联接:
select t.*,
(case when tprev.clusterid <> t.clusterid then 1 else 0 end) as ClusterSwitch
from threads t left join
threads tprev
on t.threadid = tprev.threadid + 1;
如果您无法确定没有间隙,可以使用相关子查询执行此操作:
select t.*,
(case when t.clusterid <>
(select t2.clusterid
from threads t2
where t2.id < t.id
order by t2.id desc
limit 1
)
then 1 else 0 end) as ClusterSwitch
from threads t;
但是,此查询无法很好地扩展,因此性能可能会成为一个问题。