序列通过SQL

时间:2017-03-02 04:57:09

标签: sql sequence teradata

我需要通过单个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方。

1 个答案:

答案 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);