如何查询连续字段 B 的次数和内容
【问题】
具体如下:
数据库的表结构简单如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
SQL code
注意:字段id和A的排列不一定是连续的
要求如下:
查询的结果:
(1)在A的连续下查询B等于某个值的内容和次数:比如B 【B=15】
SQL code
1 2 3 |
|
或者这样
SQL code
1 2 |
|
(2)在A的连续下查询B在某个区间内的内容和次数:比如 B【0<B<7】
SQL code
1 2 3 4 5 6 7 8 |
|
或者这样
SQL code
1 2 3 |
|
暂时就这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:新建一个由id、Astart、Aend、count 、B字段组成的新序表,Astart为每组第一条记录的A字段值,Aend为每组最后一条记录的A字段值,count为每组的成员个数
其中A4得到第一种格式的结果:
A5得到第二种格式的结果:
如果想求B的区间,只需要将A2中的B==15改为 B>0 && B<7 即可。写好的脚本也很方便集成到应用程序中,可以参考Java 如何调用 SPL 脚本