【问题】
具体如下:
数据库的表结构简单如下:
| 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 脚本
这篇博客探讨了如何在SQL中查询连续字段B的特定值出现的次数和内容,包括B等于某个值和在指定区间内的情况。文章通过示例展示了针对Sqlite3, MySQL, SQL的不同查询方法,并指出在不支持窗口函数的数据库中此类查询的挑战。作者建议使用SPL脚本来简化和统一不同数据库之间的查询差异,提供了具体的SPL脚本示例,以实现这两种查询需求。"
113287296,10553181,Spark foreachPartition 批量插入MySQL优化实践,"['Spark开发', '数据库操作', '性能优化']
686

被折叠的 条评论
为什么被折叠?



