有可能按计数分组吗?

时间:2016-11-07 16:51:18

标签: sql sqlite

我想改变这样的事情:

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结束。然后我按顺序重复这个过程。

简而言之,我试图在每个索引中对同一个Record的顺序块执行计数分组。换句话说,我 NOT 正在寻找这个:

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

它将所有内容组合在同一条记录中,而我希望它们可以通过序列分隔来分隔。

有没有办法在SQL中执行此操作?

1 个答案:

答案 0 :(得分:0)

如果没有单个主键,很难解决您的问题,所以我假设您有一个主键列增加每一行(primkey)。如果前一个primkey行具有与当前一个相同的索引和记录,则此请求将返回具有值为1的'diff'列的相同表,否则为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表达式为false时都会增加,你会得到如下结果:

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

哪个会解决您的问题,您只需将'diff'添加到group by子句中。 不幸的是我无法在sqlite上测试它,但你应该能够使用变量like this。 这可能是一个肮脏的解决方法,但我找不到更好的方法,希望它有所帮助。