这有效,如果number
is an integer
or bigint
:
select min(a.number) as root, b.number as derivative
from nums a
cross join lateral generate_series(1, 18) as gs(power)
join nums b
on b.number / (10^gs.power)::bigint = a.number
group by b.number
order by root, derivative;
编辑:我将一个不起作用的查询移动到底部。由于 @Morfic 在评论中概述的原因,它失败了。
我们可以使用以下方法进行类似且更简单的连接like
对于字符类型:
select min(a.number) as root, b.number as derivative
from numchar a
join numchar b on b.number like a.number||'%'
and b.number != a.number
group by b.number
order by root, derivative;
Updated
错误的解决方案如下
如果数字是字符类型,请尝试以下操作:
with groupings as (
select number,
case
when number like (lag(number) over (order by number))||'%' then 0
else 1
end as newgroup
from numchar
), groupnums as (
select number, sum(newgroup) over (order by number) as groupnum
from groupings
), matches as (
select min(number) over (partition by groupnum) as root,
number as derivative
from groupnums
)
select *
from matches
where root != derivative;
应该只有一个排序groupnum
在此执行中,因为该列是表的主键。
数据库小提琴