这是一个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
答案 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)