我在编写一个 sql 查询时遇到困难。我的需要是在一组行中,我必须为每一行分配一个序列,我可以简单地使用排名来编写查询。 但是,我还需要使用序列号的下限和上限,如果超过上限,我必须从下限重新开始。
我可以使用行号或等级对组中的每一行进行编号。但是上面的要求已经基本完成了,但是对于某些行,分配了错误的数字。
我会尝试用一个例子来解释
我尝试过示例查询,但它没有给出完整的正确结果。 谁能给我一些指导来纠正这个代码?
with mylimits as
(select 5 lowerlimit, 8 upperlimit from dual),
mydata as
(SELECT Rownum A FROM Dual CONNECT BY Rownum <= 15)
select m.a,
case
when m.a = mod(m.a, l.upperlimit - l.lowerlimit + 2) then
m.a + l.lowerlimit - 1
when m.a <> mod(m.a, l.upperlimit - l.lowerlimit + 2) then
mod(m.a, l.upperlimit - l.lowerlimit + 2) + l.lowerlimit
end rep_seq
from mydata m, mylimits l
我认为您可以使用
mod(m.a - 1, l.upperlimit - l.lowerlimit + 1)
定义限制并计算周期内的位置
示例小提琴
WITH mylimits AS (
SELECT 5 AS lowerlimit, 8 AS upperlimit FROM dual
),
mydata AS (
SELECT ROWNUM AS a FROM dual CONNECT BY ROWNUM <= 15
)
SELECT m.a row_num,
mod(m.a - 1, l.upperlimit - l.lowerlimit + 1) + l.lowerlimit AS rep_seq_5_to_8
FROM mydata m, mylimits l
ORDER BY m.a;
输出
ROW_NUM | REP_SEQ_5_TO_8 |
---|---|
1 | 5 |
2 | 6 |
3 | 7 |
4 | 8 |
5 | 5 |
6 | 6 |
7 | 7 |
8 | 8 |
9 | 5 |
10 | 6 |
11 | 7 |
12 | 8 |
13 | 5 |
14 | 6 |
15 | 7 |