【发布时间】:2017-03-16 17:10:48
【问题描述】:
我有这样的分配表
EMPLID | RCD | COMPANY | EFFDT | SALARY
---------------------------------------------------
100 | 0 | xyz | 1/1/2000 | 1000
100 | 0 | xyz | 1/15/2000 | 1100
100 | 0 | xyz | 1/31/2000 | 1200
100 | 0 | ggg | 2/15/2000 | 1500
100 | 1 | abc | 3/1/2000 | 2000
100 | 1 | abc | 4/1/2000 | 2100
我需要一个计数器,只要 RCD 或公司组合发生变化,它就会增加,并且应该由 effdt 订购。
EMPLID | RCD | COMPANY | EFFDT | SALARY | COUNTER
-------|-----|---------|---------------|-------------|----------
100 | 0 | xyz | 1/1/2000 | 1000 | 1
100 | 0 | xyz | 1/15/2000 | 1100 | 1
100 | 0 | xyz | 1/31/2000 | 1200 | 1
100 | 0 | ggg | 2/15/2000 | 1500 | 2
100 | 1 | abc | 3/1/2000 | 2000 | 3
100 | 1 | abc | 4/1/2000 | 2100 | 3
我尝试了按 EMPLID、RCD、COMPANY 排序的 Dense_Rank 函数,它为我提供了计数器,但它不是按 effdt 排序的。
SELECT EMPLID,RCD,COMPANY,EFFDT,
DENSE_RANK() over (order by EMPLID , RCD , COMPANY) AS COUNTER
FROM ASSIGNMENT ;
按 EFFDT 排序,给出增量计数器 1 ... 6
SELECT EMPLID,RCD,COMPANY,EFFDT,
DENSE_RANK() over (order by EFFDT) AS COUNTER
FROM ASSIGNMENT;
请帮助我找出我缺少的东西。
【问题讨论】:
-
只要您的数据顺序相同,Dense_rank 将保持相同的数字...所以如您所见,如果您按日期进行密集排名,它会给出 1 到 6...只需使用 'dense_rank( )作为计数器(按公司订购),并在 EFFDT 的选择查询订单结束时......它会给你你想要的
-
如果表中的下一行(对于
EMPLID=100, EFFDT=5/1/2000)具有RCD=0, COMPANY=xyz的组合,那么所需的输出是什么?计数器应该返回 1,还是应该分配一个新值 4? -
@mathguy 应该是 1
-
@Veljko89 - 我最后尝试通过 EFFDT 订购,但它仍然会将等级 1 提供给 (0,ggg) 和 2 给 (0,xyz),因为它是由 emplid 、rcd 和公司订购的首先,不是effdt。只有通过 EFFDT 下单的差异才会使显示的结果将由 EFFDT 下单。所以 Rank 2 将首先显示,然后显示 1。
-
@mathguy - 我有另一个要求,如果 RCD 和 COMPANY 组合重复,我需要排名为 4 。你能帮我解决一下吗。
标签: sql oracle row-number rownum dense-rank