oracle sql中一组数据内的重复序列

问题描述 投票:0回答:1

我在编写一个 sql 查询时遇到困难。我的需要是在一组行中,我必须为每一行分配一个序列,我可以简单地使用排名来编写查询。 但是,我还需要使用序列号的下限和上限,如果超过上限,我必须从下限重新开始。

我可以使用行号或等级对组中的每一行进行编号。但是上面的要求已经基本完成了,但是对于某些行,分配了错误的数字。

我会尝试用一个例子来解释

enter image description here

我尝试过示例查询,但它没有给出完整的正确结果。 谁能给我一些指导来纠正这个代码?

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
sql oracle-database
1个回答
0
投票

我认为您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.