具有多个条件的系列创建

时间:2019-09-09 05:15:28

标签: sql postgresql

如何生成将写入新列0001且仅在第28行之后更改为0002,然后在第35行之后更改为0003的系列。然后将在第28行之后再次写入0004,依此类推。

Example:

Row_num   New_Column

1         0001
2         0001
.          .
.          .
28        0001
29        0002
.          .
.          .
55        0002
56        0003
.          .
.          .
90        0003
91        0004

2 个答案:

答案 0 :(得分:0)

这是一个简单但有点浅的

insert into to_period(New_column)
case when row_num=>1 and row_num<29 then '0001' --28
when row_num=>29 and row_num<57 then "0002" --28
when row_num=>57 and row_num<92 then "0003" --35
when row_num=>92 and row_num<120 then "0004" --28
when row_num=>120 and row_num<148 then "0005" --28
when row_num=>148 and row_num<183 then "0006" --35
when row_num=>183 and row_num<211 then "0007" --28
when row_num=>211 and row_num<239 then "0008" --28
when row_num=>239 and row_num<274 then "0009" --35
when row_num=>274 and row_num<302 then "00010" --28
when row_num=>302 and row_num<330 then "00011" --28
when row_num=>330 and row_num<365 then "00012" --35
end;

答案 1 :(得分:0)

您可以使用模运算。对于您提出的问题(在28和35处切换):

select val,
       1 + 2 * floor((val - 1) / 35) + ((val - 1) % 35 >= 28)::int
from generate_series(1, 100, 1) gs(val) ;

对于隐含的问题,您仅以28的倍数进行切换:

select val, 1 + floor((val - 1) / 28)
from generate_series(1, 100, 1) gs(val) ;