每隔5行重置索引-Oracle SQL



如何使索引列在到达第5行后重新开始?我不能用窗口函数做到这一点,因为没有组,我只需要一个最大值为5的索引,如下所示:

日期01.01.21102.01.2103.01.2104.01.21421年1月5日06.01.21<1>07.01.21

您可以使用下面的解决方案。

  1. 首先,在内联视图中对表中的行进行排序(row_number分析函数(
  2. 然后,再次将row_number函数与分区通过子句一起使用,以按TRUNC((rnb-1(/5(对先前排名的行进行分组
SELECT t."DATE"
, row_number()over(PARTITION BY TRUNC((rnb - 1)/5) ORDER BY rnb) as "INDEX"
FROM (
select "DATE", row_number()OVER(ORDER BY "DATE") rnb
from Your_table
) t
ORDER BY 1
;

db<上的演示>小提琴

您关于使用分析函数的评论是错误的;您可以使用分析函数,即使在没有";组";(或"分区"(。在这里,您确实需要一个分析函数,以对行排序(即使您不需要对它们进行分区(。

这里有一个非常简单的解决方案,只使用row_number()。注意with子句,它不是解决方案的一部分;我把它包括进来只是为了测试。在实际情况中,删除with子句,并使用实际的表名和列名。mod(... , 5)的使用非常明显;它看起来有点奇怪(减去1,取模,然后加1(,因为在Oracle中,我们似乎在所有情况下都是从1开始计数,而不是其他语言(如C(中常见的从0开始计数。

注意,dateindex都是保留关键字,不应用作列名。我用了一种常见的方法来解决这个问题——我在结尾加了一个下划线。

alter session set nls_date_format = 'dd.mm.rr';
with
sample_inputs (date_) as (
select date '2021-01-01' from dual union all
select date '2021-01-02' from dual union all
select date '2021-01-03' from dual union all
select date '2021-01-04' from dual union all
select date '2021-01-05' from dual union all
select date '2021-01-06' from dual union all
select date '2021-01-07' from dual
)
select date_, 1 + mod(row_number() over (order by date_) - 1, 5) as index_
from   sample_inputs
;
DATE_        INDEX_
-------- ----------
01.01.21          1
02.01.21          2
03.01.21          3
04.01.21          4
05.01.21          5
06.01.21          1
07.01.21          2

您可以将MOD()ROW_NUMBER()组合以获得所需的索引。例如:

select date, 1 + mod(row_number() over(order by date) - 1, 5) as idx from t

最新更新