甲骨文生成数据

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 或类似的东西。

祝你好运。