我需要通过单个SQL查询生成以下序列。
party1 party2
1 0
2 1
3 3
4 5
5 8
6 11
7 14
8 17
9 21
10 25
我们应该输入party1,并且应该生成第2方。
答案 0 :(得分:0)
根据shA.t发布的to the link,公式为:
n*ceiling(log_2 n) - 2^ceiling(log_2(n)) + 1
在Postgres中,这可以写成:
select n as party1
(n*ceiling(log(2.0, n)) - 2^ceiling(log(2.0, n)) + 1)::int as party2
from generate_series(1,10) x(n);
由于问题仅用sql
标记,因此以下是ANSI SQL(log()
函数除外):
with recursive numbers (n) as (
values (1)
union
select p.n + 1
from numbers p
where p.n <= 9
)
select n, cast(n*ceiling(log(2.0, n)) - power(2,ceiling(log(2.0, n))) + 1 as integer)
from numbers;
对于不支持(递归)公用表表达式的数据库,只需创建数字表:
create table numbers (n integer);
insert into numbers (n)
values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);