SQL dense_rank函数

时间:2013-08-12 15:25:09

标签: sql sql-server dense-rank

这是一个sql dense_rank函数问题。我一直在研究互联网试图找到答案。我尝试了几个版本,但没有任何工作。这就是我遇到的问题:有人在7月13日更改了一个程序。从7月14日开始,该计划现在消除了薪水领域。我必须找到最新的记录= 0,然后是第二个最新的记录,它是>这是我尝试过的代码之一:

(SELECT contract_nbr, 
        business_unit, 
        ymdeff, 
        ymdend, 
        ymdtrans, 
        void, 
        salary, 
        Dense_rank() 
          OVER ( 
            partition BY contract_nbr 
            ORDER BY ymdend, salary DESC) 
 FROM   (SELECT DISTINCT contract_nbr, 
                         business_unit, 
                         ymdeff, 
                         ymdend, 
                         ymdtrans, 
                         void, 
                         salary 
         FROM   contract_span 
         WHERE  business_unit = 'KA' 
                AND ymdtrans > 20130714 
                AND contract_nbr = 'XXXX')) 

这些是结果。他们看起来不错,只是我只需要底部2行。有没有办法只收到最后两行? YMDEND并不总是99991231所以我不能使用该字段。

CONTRACT_NBR    BUSINESS_UNIT   YMDEFF  YMDEND  YMDTRANS    VOID    SALARY
XXXX                  KA      20130101  20130531    20130725    V   129300
XXXX                  KA      20130101  20130531    20130725        0
XXXX                  KA      20130601  99991231    20130725    V   129300
XXXX                  KA      20130601  99991231    20130725        0

1 个答案:

答案 0 :(得分:1)

我认为你根本不想dense_rank()。相反,根据薪水是否为0对每个合同进行分区。然后使用row_number()枚举值和逻辑来选择您想要的那些:

from (SELECT contract_nbr, business_unit, ymdeff, ymdend, ymdtrans, void, salary,
             row_number() over (partition by contract_nbr,
                                             (case when salary = 0 then '0' else '+' end)
                                order by ymdend desc
                               ) as SalarySeqNum
      . . .
     ) t
where (salary = 0 and salarySeqNum = 1) or
      (salary > 0 and salarySeqNum = 2)