每组每x行排序

时间:2018-11-01 08:38:16

标签: sql oracle grouping window-functions ranking-functions

例如,我有一张桌子(每天排名增加一):

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

,我想添加新的列调用“组”,对于 每个组 ,该列调用每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函数。

谢谢。

编辑:18年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

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您可以通过使用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

答案 1 :(得分:0)

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