如何使索引列在到达第5行后重新开始?我不能用窗口函数做到这一点,因为没有组,我只需要一个最大值为5的索引,如下所示:
日期您可以使用下面的解决方案。
- 首先,在内联视图中对表中的行进行排序(row_number分析函数(
- 然后,再次将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开始计数。
注意,date
和index
都是保留关键字,不应用作列名。我用了一种常见的方法来解决这个问题——我在结尾加了一个下划线。
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