甲骨文生成数据
Oracle generate Data
我尝试使用 "by level" 表达式生成数据。
我要生成GROUPNR,从1开始,
同时每组包含 4 个项目,nr 为 1 到 4
This is, how the result should look like
groupnr itemnr
1 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4
3 1
我使用了这个语句,但我不知道如何处理 nvl2 或其他函数以获得正确的值
select level, floor(level+3/4) GROUPNR, nvl2(0, mod(level,4),4) ITEMNR
from dual
connect by level <= 25;
The result of the select is:
groupnr itemnr
1 1
1 2
1 3
1 0
2 1
2 2
2 3
2 0
4 1
请提示如何修改级别以获得正确的值。
再见 Jochen
这可能是一种方式:
select floor((level -1) / 4) +1 as groupNR,
row_number() over (partition by floor((level -1) / 4) +1 order by level) as itemNR
from dual
connect by level <= 25;
甚至,没有解析函数:
level - 4*floor((level -1) / 4) as itemNR
测试:
SQL> select floor((level -1) / 4) +1 as groupNR,
2 row_number() over (partition by floor((level -1) / 4) +1 order by level) as itemNR,
3 level - 4*floor((level -1) / 4) as itemNR_2
4 from dual
5 connect by level <= 25
6 order by level;
GROUPNR ITEMNR ITEMNR_2
---------- ---------- ----------
1 1 1
1 2 2
1 3 3
1 4 4
2 1 1
2 2 2
2 3 3
2 4 4
3 1 1
3 2 2
3 3 3
3 4 4
4 1 1
4 2 2
4 3 3
4 4 4
5 1 1
5 2 2
5 3 3
5 4 4
6 1 1
6 2 2
6 3 3
6 4 4
7 1 1
25 rows selected.
作为 Aleksejs 解决方案的变体(感谢):
select floor((level +3) / 4) as groupNR,
row_number() over (partition by floor((level +3) / 4) +1 order by 1) as itemNR
从双
按级别连接 <= 25;
您的查询非常接近。我建议您将其更改为:
select level,
TRUNC((LEVEL-1) / 4) + 1 AS GROUPNR,
mod(LEVEL-1, 4) + 1 AS ITEMNR
from dual
connect by level <= 25
这会产生:
LEVEL GROUPNR ITEMNR
1 1 1
2 1 2
3 1 3
4 1 4
5 2 1
6 2 2
7 2 3
8 2 4
9 3 1
10 3 2
11 3 3
12 3 4
13 4 1
14 4 2
15 4 3
16 4 4
17 5 1
18 5 2
19 5 3
20 5 4
21 6 1
22 6 2
23 6 3
24 6 4
25 7 1
LEVEL 不会为 NULL,因此无需 fiddle 使用 NVL 或类似的东西。
祝你好运。
我尝试使用 "by level" 表达式生成数据。
我要生成GROUPNR,从1开始, 同时每组包含 4 个项目,nr 为 1 到 4
This is, how the result should look like
groupnr itemnr
1 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4
3 1
我使用了这个语句,但我不知道如何处理 nvl2 或其他函数以获得正确的值
select level, floor(level+3/4) GROUPNR, nvl2(0, mod(level,4),4) ITEMNR
from dual
connect by level <= 25;
The result of the select is:
groupnr itemnr
1 1
1 2
1 3
1 0
2 1
2 2
2 3
2 0
4 1
请提示如何修改级别以获得正确的值。 再见 Jochen
这可能是一种方式:
select floor((level -1) / 4) +1 as groupNR,
row_number() over (partition by floor((level -1) / 4) +1 order by level) as itemNR
from dual
connect by level <= 25;
甚至,没有解析函数:
level - 4*floor((level -1) / 4) as itemNR
测试:
SQL> select floor((level -1) / 4) +1 as groupNR,
2 row_number() over (partition by floor((level -1) / 4) +1 order by level) as itemNR,
3 level - 4*floor((level -1) / 4) as itemNR_2
4 from dual
5 connect by level <= 25
6 order by level;
GROUPNR ITEMNR ITEMNR_2
---------- ---------- ----------
1 1 1
1 2 2
1 3 3
1 4 4
2 1 1
2 2 2
2 3 3
2 4 4
3 1 1
3 2 2
3 3 3
3 4 4
4 1 1
4 2 2
4 3 3
4 4 4
5 1 1
5 2 2
5 3 3
5 4 4
6 1 1
6 2 2
6 3 3
6 4 4
7 1 1
25 rows selected.
作为 Aleksejs 解决方案的变体(感谢):
select floor((level +3) / 4) as groupNR, row_number() over (partition by floor((level +3) / 4) +1 order by 1) as itemNR 从双 按级别连接 <= 25;
您的查询非常接近。我建议您将其更改为:
select level,
TRUNC((LEVEL-1) / 4) + 1 AS GROUPNR,
mod(LEVEL-1, 4) + 1 AS ITEMNR
from dual
connect by level <= 25
这会产生:
LEVEL GROUPNR ITEMNR
1 1 1
2 1 2
3 1 3
4 1 4
5 2 1
6 2 2
7 2 3
8 2 4
9 3 1
10 3 2
11 3 3
12 3 4
13 4 1
14 4 2
15 4 3
16 4 4
17 5 1
18 5 2
19 5 3
20 5 4
21 6 1
22 6 2
23 6 3
24 6 4
25 7 1
LEVEL 不会为 NULL,因此无需 fiddle 使用 NVL 或类似的东西。
祝你好运。