Sql 如何确定最大月份、年份和月份
我有一个表,用于存储员工的工资信息(包含国家ID、SALYEAR、SALMOUNT、SALAMOUNT、支付日期等字段的工资) 我需要从该表中提取数据,包括上个月向员工支付工资的数据 不幸的是,该表中的DATE_PAID列在许多情况下都为空,这迫使我考虑使用SALYEAR和SALMONTH的组合来确定最高值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
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
值?