回答

收藏

PostgreSQL-列值已更改-选择查询优化

技术问答 技术问答 183 人阅读 | 0 人回复 | 2023-09-14

说说我们有一张桌子:/ k* A) h$ j9 c, h
CREATE TABLE p(   id serial NOT NULL,   val boolean NOT NULL,   PRIMARY KEY (id));填一些行:- [. f" B0 Y- F
insert into p (val)values (true),(false),(false),(true),(true),(true),(false);1 12 03 04 15 16 17 我想确定什么时候值。因此,我的查询结果应该是:
; H. ]$ d/ H' q! x身份验证2 04 17 我有一个连接和子查询的解决方案:0 X2 z+ N3 t7 Y" r$ U5 p9 m: c, Q2 i
select min(id) id,val from(  select p1.id,p1.val,max(p2.id) last_prev  from p p1  join p p2    on p2.id 但是效率很低,对于有很多行的手表,工作会很慢。
: Y8 m2 W5 H. M- Q* B  K. \/ M我相信使用PostgreSQL窗口函数可能有更有效的解决方案?
; r" N# g2 k+ Q1 l7 p3 C  ]" V8 gSQL小提琴
& K* o: U( B- g                                                               
2 u! D8 e) J. n0 L0 G( P7 w    解决方案:                                                                , r+ V) Y; N  A5 x; O. F
                                                                这就是我如何通过分析来做到这一点:
2 g! Z% R0 I5 l8 f  W$ J+ N% ESELECT id,val  FROM ( SELECT id,val  LAG(val) OVER (ORDER BY id) AS prev_val       FROM p ) x  WHERE val  COALESCE(prev_val,val)  ORDER BY id更新(一些解释):) k8 k1 p$ l) g  h
分析功能充当后处理步骤。查询结果分为多组(partition by),分析功能应用于分组的上下文。
1 }5 h4 _" a% r( x在这种情况下,查询是从中进行的选择p。应用的分析函数是LAG。由于没有partitionby因此,只有一个分组:整个结果集。分组按顺序排序id。- N, J- }: q3 d; n6 Y' ^! }
LAG使用指定的顺序返回分组中最后一行的值。因此,每行都有一个额外的列(别名)prev_val),该val列是前一行。那就是子查询。
# \4 }2 C  Y( Q; a7 b% u4 x然后我们和上一行一起搜索(prev_val)val不匹配的val行。该COALESCE没有以前值的第一行处理句柄的特殊情况。
. s9 E9 Y* C8 ~+ r" J' H6 [起初,分析函数可能看起来很奇怪,但在搜索分析函数时发现了许多例子,并介绍了它们的工作方法。http9 u1 C& U- g4 H. p0 U
:
0 q/ \$ ?, Q1 ~0 D9 z0 C//www.cs.utexas.edu/~cannata/dbms/Analytic Functions in Oracle 8i and 9i.htm请记住,这是一个后处理步骤。除非对子函数进行子查询,否则无法过滤分析函数的值。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则