每组每 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 行排名的主要内容,如果未能解决你的问题,请参考以下文章