用SQL實現Farey數列

lt發表於2016-12-22

如果指定一個分母的上限,再把最簡分數按從小到大的順序排列,比如說,當分母不大於7時,我們可以得到以下17個分數:1/7,1/6,1/5,1/4,2/7,1/3,2/5,3/7,1/2,4/7,3/5,2/3,5/7,3/4,4/5,5/6,6/7。這就是所謂的“法萊數列”(Farey序列)。

var n number
exec :n:=7
with t as(select level l from dual connect by level<=:n),
t2 as(select a.l/b.l v,a.l||'/'||b.l s,
row_number()over(partition by a.l/b.l order by a.l) rn
from t a,t b
where a.l<b.l)
select listagg(s,',')within group(order by v)s
from t2 where rn=1;
-------------------------------------------------------------------
1/7,1/6,1/5,1/4,2/7,1/3,2/5,3/7,1/2,4/7,3/5,2/3,5/7,3/4,4/5,5/6,6/7

SQL因為內建排序功能,很容易把相等的分數值分組在一起

相關文章