【发布时间】:2021-11-17 19:50:39
【问题描述】:
Dok 表包含订单号:
create table dok ( doktyyp char(1),
tasudok char(25) );
CREATE INDEX dok_tasudok_idx ON dok (tasudok);
CREATE UNIQUE INDEX dok_tasudok_unique_idx ON dok (doktyyp,tasudok)
WHERE doktyyp IN ( 'T', 'U') ;
订单号包含相同的起始部分和不同的后缀,如
91000465663
91000465663-1
91000465663-2
91000465663-T
91000465663-T-1
如何创建按给定前缀返回订单序列号的查询。对于 doktyyp 列值始终为常量 'T'。
对于下面的数字,结果应该是
91000465663 returns 1
91000465663-1 returns 2
91000465663-2 returns 3
91000465663-T returns 4
91000465663-T-1 returns 5
查询
with koik as (
select rank() over (order by tasudok), tasudok
from dok
where doktyyp='T' and tasudok like '91000465663%'
)
select rank
from koik
where tasudok='91000465663-1'
似乎工作正常,但对于这个简单的任务来说看起来太长了。如何创建更短更好的查询?
解释输出:
"Subquery Scan on koik (cost=685.04..685.07 rows=1 width=8)"
" Filter: (koik.tasudok = '91000465663-1'::bpchar)"
" -> WindowAgg (cost=685.04..685.06 rows=1 width=34)"
" -> Sort (cost=685.04..685.05 rows=1 width=26)"
" Sort Key: dok.tasudok"
" -> Bitmap Heap Scan on dok (cost=23.55..685.03 rows=1 width=26)"
" Recheck Cond: (doktyyp = 'T'::bpchar)"
" Filter: (tasudok ~~ '91000465663%'::text)"
" -> Bitmap Index Scan on dok_tasudok_unique_idx (cost=0.00..23.55 rows=437 width=0)"
" Index Cond: (doktyyp = 'T'::bpchar)"
使用 postgres 11
【问题讨论】:
-
tasudok 列上是否有索引?解释说什么?
-
我更新了问题并添加了索引并解释了输出
标签: sql postgresql window-functions ranking ranking-functions