2016-11-07 48 views
0

我试图改变这样的事情:可能按计数分组吗?

Index Record Time 
1  10  100 
1  10  200 
1  10  300 
1  10  400 
1  3  500 
1  10  600 
1  10  700 
2  10  800 
2  10  900 
2  10  1000 
3  5  1100 
3  5  1200 
3  5  1300 

到这一点:

Index CountSeq  Record LastTime 
1  4   10  400 
1  1   3  500 
1  2   10  700 
2  3   10  1000 
3  3   5  1300 

我想申请每唯一索引这样的逻辑 - 我只包括三个指标来显示结果。

因此,对于给定的索引,我想通过相同记录的条纹来组合它们。因此,请注意索引1的前四个条目具有记录10,但更简洁地说,有4个条目与10条记录在时间400结束。然后重复按顺序前进的过程。

总之,我试图对每个索引内的相同记录的顺序块执行计数分组。换句话说,我不寻找此:

select index, count(*) as countseq, record, max(time) as lasttime 
from Table1 
group by index,record 

其中由相同的记录,而我希望他们通过序列断裂分离结合的一切。

有没有办法在SQL中做到这一点?

回答

0

没有一个主键很难解决你的问题,所以我假设你有一个主键列来增加每行(primkey)。该请求将与具有值为1的“差异”列返回相同的表,如果以前的primkey行具有相同的索引和记录作为当前一个,否则为0:

SELECT *, 
IF((SELECT index, record FROM yourTable p2 WHERE p1.primkey = p2.primkey) 
= (SELECT index, record FROM yourTable p2 WHERE p1.primkey-1 = p2.primkey), 1, 0) as diff 
FROM yourTable p1 

如果你使用一个临时变量每次IF表达式为假的增加,你会得到的结果是这样的:

primkey Index Record Time diff 
1  1  10  100  1 
2  1  10  200  1 
3  1  10  300  1 
4  1  10  400  1 
5  1  3  500  2 
6  1  10  600  3 
7  1  10  700  3 
8  2  10  800  4 
9  2  10  900  4 
10  2  10  1000 4 
11  3  5  1100 5 
12  3  5  1200 5 
13  3  5  1300 5 

这将解决你的问题,你只需通过子句添加“差异”的组。 不幸的是,我不能在sqlite上测试它,但你应该可以使用变量like this。 这可能是一个肮脏的解决方法,但我找不到更好的方法,希望它有帮助。

+0

这将组_all_记录,而不仅仅是_sequential_记录。该要求没有明确说明,但可以从预期结果中推断出来。 –