如何为包含相同值的行分配1个唯一编号

时间:2018-05-21 04:04:20

标签: sql oracle

感谢您是否可以帮助我解决我在Oracle(pl / sql)上工作的案例。

假设我有一个名为TableA的表:TableA

TableA排序规则是:

  1. CASE_ID&无论CONTRACT如何,都必须将SCORE与'SD'TRIGGER放在首位。
  2. 完成所有CONTRACT&带有'SD'TRIGGER的CASE_ID位于顶部,下一个CASE_ID&合同按SCORE降序排序。
  3. 我想为1 CASE_ID放置1个唯一编号,从1开始递增,因此使用相同CASE_ID的合同将具有相同的编号。我想要获得的解决方案的示例是:Example Solution

    我尝试使用以下查询DENSE_RANK

    select a.*
          ,dense_rank() over (partition by a.case_id order by rn) 
      from (
            select a.*,rownum as rn from TableA a
           )a
    

    但解决方案仍然不是我想要的方式,有一些CASE_ID分配了相同的NUMBER

    感谢您能否就此提供一些意见。

    非常感谢!

2 个答案:

答案 0 :(得分:1)

带分区的密集排名只会给你一个分区中的连续排名。要在没有分区的情况下使用dense_rank,请参阅 Gordon的答案。

另一种方法是在不同的case_id上​​创建row_number并连接回原始表;

SELECT TableA.* , bar.NUMBER
FROM TableA
JOIN 
(SELECT foo.CASE_ID as case_id, ROW_NUMBER() OVER (Partition by 1) as NUMBER
FROM ((SELECT DISTINCT CASE_ID FROM TableA)as foo) as bar
ON TableA.CASE_ID = bar.case_id ;

答案 1 :(得分:1)

您可以使用dense_rank()。它看起来像:

select a.*,
       dense_rank() over (order by a.case_id) 
from TableA a;

不需要partition by