使用sql在列级别获取最近2个月的员工计数?
我正在尝试获取列级别的最近2个月员工计数使用sql在列级别获取最近2个月的员工计数?,sql,oracle,Sql,Oracle,我正在尝试获取列级别的最近2个月员工计数 Below is my data: yearmm, emp_cnt 201908,100 201907,200 201906,300 201904,600 预期输出:在上例中,由于没有201905的数据,第三行的yearmonth-2为0 Yearmonth, emp_cnt, Yearmonth-1_Cnt,Yearmonth-2_Cnt 201908,100,200,300 201907,200,300,600 201906,300,600,0 2
Below is my data:
yearmm, emp_cnt
201908,100
201907,200
201906,300
201904,600
预期输出:在上例中,由于没有201905的数据,第三行的yearmonth-2为0
Yearmonth, emp_cnt, Yearmonth-1_Cnt,Yearmonth-2_Cnt
201908,100,200,300
201907,200,300,600
201906,300,600,0
201904,600,0,0
我的努力:我使用lag根据first col的订单获取最后两个月的数据,但如果一个月内有任何数据丢失,则需要上一个月的数据。有人能帮我克服这个挑战吗
with test_exp(yyyymonth,cnt) as(
select 201908,100 union
select 201907,200 union
select 201906,300 union
select 201904,600 )
select yyyymonth,cnt,LAG(cnt, 1) OVER(
ORDER BY
yyyymonth
) AS "M-yyyymonth-1_Cnt"
,LAG(cnt, 2) OVER(
ORDER BY
yyyymonth
) AS "M-yyyymonth-2_Cnt" from test_exp
这里有一种方法可以使用
lag()
:
注:假设所有日期都在一年内。您尚未明确指定数据库(也不是
yearmonth
的类型,所以我只是用减法来表示检查值是否是一个月前的值。我删除了不兼容的数据库标记。请仅使用您真正使用的数据库进行标记。您可以使用windowing子句,如.its在Oracle中。那么对于201901,它会得到去年12月和11月的计数吗?@PAS…No、 答案很清楚,它不会跨越年份界限。
select t.*,
(case when lag(yearmonth) over (order by yearmonth) = yearmonth - 1
then lag(empcnt) over (order by yearmonth)
else 0
end) as yearmonth_1,
(case when lag(yearmonth, 2) over (order by yearmonth) = yearmonth - 1
then lag(empcnt, 2) over (order by yearmonth)
else 0
end) as yearmonth_2
from t;