如何查询连续字段 B 的次数和内容

【问题】

       具体如下:
数据库的表结构简单如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

id      A        B

1      101       12

2      105       2

3      106       6

4      107       6

6      109       15

7      111       15

8      112       15

9      113       10

10     114       9

11     115       7

12     116       20

13     119       27

14     120       3

18     121       5

19     122       5

20     123       1

20     124       0

SQL code


注意:字段idA的排列不一定是连续的
要求如下:
查询的结果:
1)在A的连续下查询B等于某个值的内容和次数:比如B=15

SQL code

1

2

3

id      A        B         

7      111       15

8      112       15


或者这样

SQL code

1

2

ID       Astart     Aend      count             B

1          111       112       2          15


2)在A的连续下查询B在某个区间内的内容和次数:比如 B0<B<7

SQL code

1

2

3

4

5

6

7

8

id      A         B         

2      105        2

3      106        6

4      107        6

14     120        3

18     121        5

19     122        5

20     123        1


或者这样

SQL code

1

2

3

ID       Astart    Aend   count

1         105     107      3

2         120     123      4


暂时就这2个简单的数据分析吧,最后我想知道用Sqlite3,Mysql,SQL这三种数据库的查询区别大吗?

【回答】

       这两个是一样的,各数据库的写法差异很大,这类与序相关的运算,对于不支持窗口函数的mysql等写起来非常困难,几乎相当于没法写,还不如读出来在上层用高级语言做,或者写存储过程。即使使用窗口函数也需要用子查询绕,也很难理解。用SPL来实现,既屏蔽了各数据库间的语法差异,又写起来直观,脚本如下:


A

1

$select id,A,B from   t0047 order by id

2

=A1.select(B==15)

3

=A2.group@i(A[-1]+1!=A).select(~.len()>1)

4

=A3.conj()

5

=A3.new(#:id,~(1).A:Astart,~.m(-1).A:Aend,~.count():count,B)

A1:用sql取数,并按照id排序

A2:过滤获取B=15的记录

A3:按照相邻A字段值连续的规则分组,并取得组成员大于1的组

A4:对A3的各组成员合并

A5:新建一个由idAstartAendcount B字段组成的新序表,Astart为每组第一条记录的A字段值,Aend为每组最后一条记录的A字段值,count为每组的成员个数

其中A4得到第一种格式的结果:

undefined

A5得到第二种格式的结果:

undefined

       如果想求B的区间,只需要将A2中的B==15改为 B>0 && B<7 即可。写好的脚本也很方便集成到应用程序中,可以参考Java 如何调用 SPL 脚本