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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题】

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

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

注意:字段id和A的排列不一定是连续的
要求如下:
查询的结果:
(1)在A的连续下查询B等于某个值的内容和次数:比如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在某个区间内的内容和次数:比如 B【0<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:新建一个由id、Astart、Aend、count 、B字段组成的新序表,Astart为每组第一条记录的A字段值,Aend为每组最后一条记录的A字段值,count为每组的成员个数

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值