每组每 x 行排名

Posted

技术标签:

【中文标题】每组每 x 行排名【英文标题】:Rank every x rows per group 【发布时间】:2018-11-01 08:38:15 【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

你应该尝试在子查询中对天进行分组,例如 (select count(*) from table group by day)>2 then increment 【参考方案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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于每组每 x 行排名的主要内容,如果未能解决你的问题,请参考以下文章

PowerPivot DAX - 每组动态排名(每组最小值)

赛马题

如何在R中一次按两列对行进行排名?

分组后取每组内排名的Top N的SQL语句

SQL 查询获取主选择查询上的行排名或位置

普通平衡树