1

这是一个 sql dense_rank 函数问题。我一直在研究互联网试图找到答案。我已经尝试了几个版本,但没有任何工作。这是我遇到的问题:有人在 7/13 更改了程序。从 7 月 14 日起,该计划现在消除了薪水领域。我必须找到 = 0 的最新记录,然后找到 > 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 无效工资
XXXX KA 20130101 20130531 20130725 V 129300
XXXX KA 20130101 20130531 20130725 0
XXXX KA 20130601 99991231 20130725 V 129300
XXXX 卡 20130601 99991231 20130725 0
4

1 回答 1

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)
于 2013-08-12T15:36:14.037 回答