提问人:Rodrigo 提问时间:8/18/2023 最后编辑:jarlhRodrigo 更新时间:8/18/2023 访问量:34
表中的 Postgres 序列
Postgres sequence from table
问:
我有一张桌子。
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
有什么想法吗?
答:
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 |
如果您需要任意 ID 列,只需在 select 语句中添加一个。row_number()
评论
ID