如何选择相邻行到任意行(在sql或postgresql中)?
技术问答
531 人阅读
|
0 人回复
|
2023-09-14
|
我想根据某些条件选择一些行,然后从该集合中获取一个条目,并在其前后输入5行。
! ^1 k2 E, c/ L* O7 A9 ~现在,如果表上有一个主键,我可以用数字方式执行此操作(例如,在数字上,主键比目标行的键小5,而目标行的键的数字多5)。
8 N2 n% H t$ _6 C5 b因此,选择主键为7的行以及附近的行:* s; v8 G5 n9 t3 [1 L# ^3 [. K* U
select primary_key from table where primary_key > (7-5) order by primary_key limit 11;( L3 L- c/ I, F3 J$ F9 F _, F1 D
2
1 [) V' `1 A3 M; Z. u- J36 @1 C% y5 {, A+ i; F. C, D9 Z
4
: Q( c3 |; m# {2 _- M' P& O- X7 f5
0 H ]% _6 w1 i4 \/ ]6
4 K- C- H3 U# h% y-=7=- y8 W$ S1 e2 ` R4 U
88 y/ m. y1 M& [2 Z/ j
9
Z2 S% s- E/ L; z3 z10
: _5 G7 X3 X9 H) I `; S11# U2 W8 A/ \4 u3 f; c- P/ b. z% m
125 F, z* b2 J! X8 ~
但是,如果我仅选择某些行作为开始,则会丢失使用主键的数字方法(并且假设键无论如何在顺序上都没有任何间隙),并且需要另一种方法来获取之前和之后的最接近的行。在特定的目标行之后。
, A6 n! T2 A, k. u这样的选择的主键输出可能看起来更加随机,因此对数学定位的接受程度较低(因为某些结果将被过滤掉,例如使用where active=1): F+ c3 x d5 i% V" o( z* B0 m
select primary_key from table where primary_key > (34-5)
. m4 ?) z2 T5 ~5 I/ e& A order by primary_key where active=1 limit 11;
: _0 @" T, G, ]/ o$ k30
: R7 A( W$ H: n& u-=34=-4 m+ {; q+ _6 P6 w* z
80
% M$ }6 n5 g g& q83
$ n5 G0 C0 B$ A" ?" L100
0 y; q M8 r l( T/ ?* {113
% [4 u& d, G+ k9 }125
; c& h! E" {, T' K/ i1260 W8 R1 L6 d/ q# h. m+ o/ u
127
6 k1 S/ n7 i1 V' M0 b2 K128- ^, O0 z1 ?# c: G% T
129
* Q! ]" ]$ s: H( l/ I9 I请注意,由于示例中条件( 例如becaseu有许多不活动的项目
6 Y- Y7 K+ m" A4 ?)所引起的主键之间的间隙,我不再获得最接近的5和下面的5,而是获得最接近的1以及上面最接近的9。
- D# Q2 x: v4 l ( z4 d5 s- U- Q( Y: {
解决方案:
5 D! F: G+ S, j6 d4 e* ~: {6 Y9 ~
" I0 F0 d( K) { F* [5 a6 N6 {
3 d: ?1 o( z6 ^& v2 n" X
( M( }3 \% _- s1 G% S$ k {& f 如果您使用一种编程语言运行两个查询,则有很多方法可以执行此操作,但是,这是在一个SQL查询中执行此操作的一种方法:- Z7 z& I0 P) z% W5 K4 }
(SELECT * FROM table WHERE id >= 34 AND active = 1 ORDER BY id ASC LIMIT 6)! g7 S% X. D. r* v9 N
UNION9 S; h- C. J4 ?9 u8 U0 j! n7 O& z% F
(SELECT * FROM table WHERE id 这将返回上面的5行,目标行和下面的5行。 |
|
|
|
|
|