[英]how to determine Maximum Month Year and Month
我有一個存儲員工工資信息的表(SALARY,其中包含 NATIONAL_ID、SALYEAR、SALMONTH、SALAMOUNT、DATE_PAID 等字段)。
我需要從該表中提取數據,包括員工上個月的工資。
不幸的是,對於該表中的許多情況,DATE_PAID 列是 null,這迫使我考慮使用 SALYEAR、SALMONTH 的組合來確定最高值。
SALMONTH 存儲 1-12 的數字,SALYEAR 存儲年份信息,即 2010、2015 等。
使用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
的最新記錄,其中“最新”被定義為最近一年中的最近一個月。
select max(to_date(sal_year||to_char(sal_month,'FM00'),'yyyymm'))
應該這樣做。 如果您想要日期數據類型,TO_DATE 實際上只是為了完整性。
您需要像這樣使用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;
如果要將年月轉換為日期:
select nationalid,
to_date(max(salyear * 100 + salmonth), 'YYYYMM') as salyearmonth
from t
group by nationalid;
這將返回工資月的第一個日期。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.