如何确定最大月-年-月

rbl8hiat  于 2021-07-24  发布在  Java
关注(0)|答案(5)|浏览(174)

我有一个表,其中存储了员工的薪资信息(salary带有诸如national\u id、salyear、salmonth、salamount、date\u paid等字段)。
我需要从那个表中提取数据,包括上个月一个雇员的工资。
不幸的是,对于该表中的许多情况,date\u paid列为空,这迫使我考虑使用salyear和salmonth的组合来确定最高值。
salmonth商店编号为1-12,salyear商店年份信息为2010年、2015年等。

vddsk6oq

vddsk6oq1#

使用 ROW_NUMBER ,我们可以尝试:

WITH cte AS (
    SELECT t.*, ROW_NUMBER() OVER (PARTITION BY NATIONAL_ID
                                   ORDER BY SALYEAR DESC, SALMONTH DESC) rn
    FROM yourTable t
)

SELECT *
FROM cte
WHERE rn = 1;

上述方法将针对每一项的最新记录 NATIONAL_ID ,其中“latest”被定义为具有最近一年中的最近月份。

mdfafbf1

mdfafbf12#

select max(to_date(sal_year||to_char(sal_month,'FM00'),'yyyymm'))

我应该这么做。如果您想要一个日期数据类型,tou日期实际上只是为了完整性。

kqhtkvqz

kqhtkvqz3#

你需要使用 COALESCE 这样地:

SELECT MAX(COALESCE(YEAR(DATE_PAID) * 100 + MONTH(DATE_PAID), SALYEAR * 100 + SALMONTH))
FROM tablename
xpszyzbs

xpszyzbs4#

使用相关子查询-

with temp as (
    select national_id, 
    max(to_number(to_char(salyear)||lpad(to_char(salmonth),2,'0'))) as max_salmonthyear
    from salary
    group by national_id)
select *
from salary s, temp t
where s.national_id = t.national_id
  and to_number(to_char(salyear)||lpad(to_char(salmonth),2,'0')) = t.max_salmonthyear
order by 1;
ie3xauqp

ie3xauqp5#

为什么不直接使用聚合呢?

select nationalid, max(salyear * 100 + salmonth) as salyearmonth
from t
group by nationalid;

如果要将yearmonth转换为日期:

select nationalid,
       to_date(max(salyear * 100 + salmonth), 'YYYYMM') as salyearmonth
from t
group by nationalid;

返回工资月份的第一个日期。

相关问题