每组每 x 行排名

Rank every x rows per group

我有一个table例子(排名每天增加一位):

Rank,day 
1  ,sunday 
1  ,sunday 
1  ,sunday 
1  ,sunday 
2  ,monday 
3  ,friday

我想添加新的列调用 'group',对于 每个组 每 3 行增加 1。 例如:(一天 4 行:星期日,所以前 3 行将是 1,从第 4 行到第 6 行是 2 等等……):

Rank,group,day 
1 ,1 ,sunday 
1 ,1 ,sunday 
1 ,1 ,sunday 
1 ,2 ,sunday 
2 ,1 ,monday 
3 ,1 ,friday

如何用plsql添加列组?

我不能使用 rownum,因为我对第一列 'Rank' 使用了 row_number 函数。

谢谢。

编辑:2018 年 11 月 7 日:

我想为名为时间的排名列添加另一个条件。 例如:

Rank,group,day,time
1 ,1 ,sunday ,08:00 
1 ,1 ,sunday ,08:00
2 ,1 ,sunday ,09:00
3 ,2 ,sunday ,10:00
4 ,1 ,monday ,08:00
5 ,1 ,friday ,09:00
5 ,1 ,friday ,09:00

有什么建议吗?

您可以通过使用 row_number() 分析函数为组中的每一行分配一个数字来执行此操作。然后你可以将每个行号除以 3 并找到该数字的上限。这意味着组中的前三行值为 1,接下来的三行值为 2,依此类推:

WITH your_table AS (SELECT 1 rnk, 'sunday' dy FROM dual UNION ALL
                    SELECT 1 rnk, 'sunday' dy FROM dual UNION ALL
                    SELECT 1 rnk, 'sunday' dy FROM dual UNION ALL
                    SELECT 1 rnk, 'sunday' dy FROM dual UNION ALL
                    SELECT 2 rnk, 'monday' dy FROM dual UNION ALL
                    SELECT 3 rnk, 'friday' dy FROM dual)
SELECT rnk,
       dy,
       ceil(row_number() over (PARTITION BY rnk ORDER BY dy)/3) grp
FROM   your_table
ORDER BY rnk, dy, grp;

       RNK DY            GRP
---------- ------ ----------
         1 sunday          1
         1 sunday          1
         1 sunday          1
         1 sunday          2
         2 monday          1
         3 friday          1

请检查 2018 年 11 月 7 日的更新。