Sql 如何确定最大月份、年份和月份

Sql 如何确定最大月份、年份和月份,sql,oracle,Sql,Oracle,我有一个表,用于存储员工的工资信息(包含国家ID、SALYEAR、SALMOUNT、SALAMOUNT、支付日期等字段的工资) 我需要从该表中提取数据,包括上个月向员工支付工资的数据 不幸的是,该表中的DATE_PAID列在许多情况下都为空,这迫使我考虑使用SALYEAR和SALMONTH的组合来确定最高值 SALMONTH门店编号1-12和SALYEAR门店年份信息,如2010年、2015年等。使用行编号,我们可以尝试: WITH cte AS ( SELECT t.*, ROW_NU

我有一个表,用于存储员工的工资信息(包含国家ID、SALYEAR、SALMOUNT、SALAMOUNT、支付日期等字段的工资)

我需要从该表中提取数据,包括上个月向员工支付工资的数据

不幸的是,该表中的DATE_PAID列在许多情况下都为空,这迫使我考虑使用SALYEAR和SALMONTH的组合来确定最高值


SALMONTH门店编号1-12和SALYEAR门店年份信息,如2010年、2015年等。

使用
行编号
,我们可以尝试:

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;
上述方法将针对每个
国家ID
的最新记录,“最新”定义为最近一年的最近一个月

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

我应该这样做。如果您想要一个日期数据类型,则“截止日期”实际上只是为了完整性。

您需要像这样使用
COALESCE

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

使用相关子查询-

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;

为什么不直接使用聚合呢

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;

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

SQL Server、MySQL、Oracle?示例数据和所需结果将有所帮助。你想要什么结果?如何处理
NULL
值?