通过表达式只获取一组中的一条记录

Get only one record in a group by expression

假设我的工资 table 有 'paymonth' 列(付款日期) 'code1' 列(一些人力资源代码)和 'code2' 列(另一个人力资源代码)。

这里是table的内容:

paymonth        code1      code2    payment
-------------------------------------------
01/01/2021      11             3    1000
01/01/2021      11             1    750
01/02/2021      11             3    650

对于每对不同的代码 1、代码 2,我想获取最后输入的行。这里的问题是第 1 行和第 2 行的发薪月日期相同。

所以这样的查询:

select * from salary
order by paymonth
fetch first 2 row only;

会给出:

01/01/2021      11             3    1000
01/02/2021      11             3    650

这不是我想要的。我想要这个(不同的代码):

01/01/2021      11             1    750
01/02/2021      11             3    650

你能帮忙吗?

我会想到解析函数。我用了row_number,也许rank could/should会被用(取决于数据)。

SQL> with salary (paymonth, code1, code2, payment) as
  2    (select date '2021-01-01', 11, 3, 1000 from dual union all
  3     select date '2021-01-01', 11, 1,  750 from dual union all
  4     select date '2021-01-02', 11, 3,  650 from dual
  5    ),
  6  temp as
  7    (select s.*,
  8            row_number() over (partition by code1, code2 order by paymonth desc) rn
  9     from salary s
 10    )
 11  select * from temp
 12  where rn = 1;

PAYMONTH        CODE1      CODE2    PAYMENT         RN
---------- ---------- ---------- ---------- ----------
01/01/2021         11          1        750          1
01/02/2021         11          3        650          1

SQL>