回答

收藏

在一组数字中查找连续范围

技术问答 技术问答 101 人阅读 | 0 人回复 | 2023-09-13

我在数据库表中有一组相当大的电话号码(大约200万个)。这些数字已插入到块中,因此存在许多连续的数字范围,范围从10个数字到1万个数字。其中一些号码正在使用中,因此标记为不可用,其余号码可用。给定一个特定的数字,我需要一种方法来查找该数字之上和之下的连续数字范围。范围应一直持续到找到不可用的数字或遇到两个范围的边界为止。
( r  W  T& y$ m- N& K例如,给定以下设置:
3 D! `2 q; q7 {- U0 ]1000
8 T5 ^9 t$ P+ |* ~& a) @3 C1001; F# Q' s  h0 B/ k8 Q2 q
1002
6 R& N: l6 i4 t. l  Y1010* X  k  G1 H" U  b" Q: p3 {
1011
/ @0 y# w9 f* M( z6 U) e3 \1012
+ J7 }3 {/ a9 b% m# W: `5 j1013
) t4 T" h4 R  Z+ `3 X! u! f10207 V+ a+ k9 s! v
1021
) s* ]  r2 G2 X$ b' Y! M1022
5 E: @$ {, i$ J# I使用1012作为参数进行搜索应返回1010、1011、1012、1013。
7 A% d- w* z4 i$ l; b7 V形成查询以查找这些范围的好方法是什么?我们在SQL Server上使用NHibernate,使用这两种方法都可以。
9 l6 b) b/ t- s+ m               
1 L' j" l# n% `2 ~解决方案:8 i" R( c# _3 d8 N# q8 N
               
- E0 }9 l+ d  \7 J& S5 X- |3 I+ a( U$ g( W$ j
& x' s& N2 y( _) |0 C
                从理论上讲,集合中的项目没有特定的值,因此我假设您也有一些连续的ID列,这些列定义了数字的顺序。像这样的东西:
) _* x9 U: K# t1 p& w7 u  IID  Number
, T: A* a1 O, u$ J4 j1   10000 d* Z& a8 `" J$ f) c- q
2   10014 E) V* _# K1 L' U6 |0 q/ G
3   1002
: B& d/ t" z3 B6 `4   10106 ~+ j* Z3 F/ m' W) h7 p( ^
5   1011  T- F+ q: i: }0 q
6   1012
! Y! P" U) f" h# S/ w1 J7   1013
% A# H* R  \) a- ?4 `8   1020: r; H- T: n$ E
9   1021
, i' x  f: s1 }5 S10  1022
+ I# d6 n1 r+ H0 P8 x您可以创建一个额外的列,其中包含以下结果Number - ID:
& m+ C. i# A3 g; G# K* H1 SID  Number  Diff
* }( l5 [5 @* V  L1 {! n; U1   1000    999
8 H; u: v& ^, J: F& _2   1001    9990 `* w; ?  i! p5 i- T( ~
3   1002    999: R2 y: U# f; A! y7 e4 u
4   1010    1006
9 x4 }; M" o0 x/ G# |' g1 h: P5   1011    1006% }% x' w  u6 n6 a+ ?( ~
6   1012    1006/ i& }. Y4 @7 \" _
7   1013    1006+ U  ]: u! I! B9 D" i/ c
8   1020    1012
; [0 _" o$ R, Q* e' Z9   1021    1012
" k- \: r- M/ g9 I9 M# c10  1022    1012. j7 g, x+ Y" {% F' S# n2 {8 v
相同范围内的数字在“差异”列中的结果相同。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则