表中的 Postgres 序列

Postgres sequence from table

提问人:Rodrigo 提问时间:8/18/2023 最后编辑:jarlhRodrigo 更新时间:8/18/2023 访问量:34

问:

我有一张桌子。

ID  name        col lev
1   "Rack 1"    9   7
2   "Rack 2"    6   7
3   "Rack 3"    6   7
4   "Rack 4"    7   7

我想从这个表中装出第二个表,该表使用“col”和“lev”数字作为范围。此外,“lev”需要使用字母。

结果应该是看起来像这样的新 tble。

ID  Name    col lev
1   Rack 1  1   A
2   Rack 1  1   B
3   Rack 1  1   C
4   Rack 1  1   D
5   Rack 1  1   E
6   Rack 1  1   F
7   Rack 1  1   G
8   Rack 1  2   A
9   Rack 1  2   B
10  Rack 1  2   C
11  Rack 1  2   D
12  Rack 1  2   E
13  Rack 1  2   F
14  Rack 1  2   G
15  Rack 1  3   A
16  Rack 1  3   B
17  Rack 1  3   C
18  Rack 1  3   D
19  Rack 1  3   E
20  Rack 1  3   F
21  Rack 1  3   G

有什么想法吗?

SQL PostgreSQL 序列自动生成

评论

1赞 SelVazi 8/18/2023
不清楚你在问什么!中方能否提供更多信息?
1赞 Isolated 8/18/2023
那么对于机架 1,您希望有 63 行,机架 2 将有 42 行,等等?色谱柱如何适应这一点?ID 会持续递增吗?ID

答:

1赞 Isolated 8/18/2023 #1

你可以用它来实现你要找的东西。此外,创建另一个表以将 lev 整数转换为文本值。generate_series

create table my_table (
  id integer, 
  name varchar(10), 
  col integer, 
  lev integer
  );
  
insert into my_table values 
(1, 'Rack 1', 9, 7), 
(2, 'Rack 2', 2, 3);

create table lev_to_text (
 lev_val integer, 
 text_val varchar(1)
  );
  
insert into lev_to_text values 
(1, 'A'), 
(2, 'B'), 
(3, 'C'), 
(4, 'D'), 
(5, 'E'), 
(6, 'F'), 
(7, 'G'), 
(8, 'H');

with lev_series as (
  select name, 
    generate_series(1, lev) as lev
  from my_table
)
select m.name, 
  generate_series(1, m.col) as col, 
  ltt.text_val as lev
from my_table m
join lev_series ls
 on m.name = ls.name
join lev_to_text ltt
  on ls.lev = ltt.lev_val
order by 1,2,3;
名字 山坳 列弗
机架 1 1 一个
机架 1 1 B
机架 1 1 C
机架 1 1 D
机架 1 1 E
机架 1 1 F
机架 1 1 G
机架 1 2 一个
机架 1 2 B
... ... ...
机架 1 9 F
机架 1 9 G
机架 2 1 一个
机架 2 1 B
机架 2 1 C
机架 2 2 一个
机架 2 2 B
机架 2 2 C

在 DB Fiddle 上查看

如果您需要任意 ID 列,只需在 select 语句中添加一个。row_number()