php - MySQL获取表中的连续数字块
问题描述
表名:列表
列名:NPA、nxx、xxxx
目标:表由数千个条目组成。我想搜索并获取特定 npa 的连续顺序 100 xxxx,nxx。
Xxxx 值的范围从 0001 到 9999。但是该范围内的某些数字不存在。因此,我想找到第一个连续 100 个数字块。
我已经尝试了一些类似问题的建议和解决方案中提供的几种方法,但似乎都没有奏效。
任何帮助将非常感激
解决方案
您可以通过使用变量分配块号和行号来做到这一点,例如,如果我正在寻找 2 个连续数字的第一个块
DROP TABLE IF EXISTS T;
CREATE TABLE T (NXX VARCHAR(1), XXX INT);
INSERT INTO T VALUES
('A',1),('A',3),('A',4),('A',6),('A',7),('A',8),
('b',1),('b',2),('b',3),('b',4),('b',5),('b',6);
select x.nxx,x.xxx from
(
select s.nxx,min(s.block) block
from
(
SELECT T.NXX,T.XXX,
IF(T.NXX <> @PNXX OR T.XXX > @PXXX + 1 ,@B:=@B+1,@B:=@B) BLOCK,
IF(T.NXX <> @PNXX OR T.XXX > @PXXX + 1 ,@RN:=1,@RN:=@RN+1) RN,
if(@rn = 2,@lim:=1,@lim:=0) lim,
@PNXX:= T.NXX PNXX,
@PXXX:= T.XXX PXXX
FROM T
CROSS JOIN(SELECT @RN:=0,@B:=0,@PNXX:='', @PXXX:=0,@lim:=0) R
ORDER BY T.NXX,T.XXX
) s
where s.lim = 1
group by s.nxx
) w
join
(
SELECT T.NXX,T.XXX,
IF(T.NXX <> @PNXX_1 OR T.XXX > @PXXX_1 + 1 ,@B1:=@B1+1,@B1:=@B1) BLOCK,
IF(T.NXX <> @PNXX_1 OR T.XXX > @PXXX_1 + 1 ,@RN1:=1,@RN1:=@RN1+1) RN,
if(@rn1 = 2,@lim1:=1,@lim1:=0) lim,
@PNXX_1:= T.NXX PNXX,
@PXXX_1:= T.XXX PXXX
FROM T
CROSS JOIN(SELECT @RN1:=0,@B1:=0,@PNXX_1:='', @PXXX_1:=0,@lim1:=0) R
ORDER BY T.NXX,T.XXX
) x on x.block = w.block and x.rn <= 2
order by x.block,x.nxx,x.xxx;
在子查询 s 计算出块以及是否已达到 2 个连续数字的情况下,导出 nxx 的最小块并连接到另一个子查询,该子查询提取所需的块
+------+------+
| nxx | xxx |
+------+------+
| A | 3 |
| A | 4 |
| b | 1 |
| b | 2 |
+------+------+
4 rows in set (0.23 sec)
推荐阅读
- dart - 具有 Maps 的 Null 感知运算符
- jquery - 如何使用 jQuery 为小空间中的大文本实现文本轮播?
- jsf - PrimeFaces 推送到 OmniFaces 推送迁移问题
- python - 多处理池在 Dask 函数中失败
- jquery - 如何在 Swagger 生成的 typescript-jquery 客户端中设置 OAuth 授权令牌
- android - Android Studio 中的应用共享按钮
- javascript - iOS 在 Powerpoint 中从 Cordova 应用程序打开 ppt/pptx 文件
- angular - HTTP_INTERCEPTORS 的 multi:true 属性是什么意思?
- javascript - Express JS 中的 POST 函数
- typescript - Intersection not merging enums for property