【发布时间】:2020-03-11 03:15:58
【问题描述】:
我有一个表格,按年份和月份存储用户报告的已完成活动的小时数。我在旧的 Oracle 数据库中有一个函数,我需要在 SQL Server 中复制它,它显示连续 0 小时报告的当前值。即当某人连续 3 个月没有报告小时数时,该数字将是 3,如果他们已经报告了给定月份,则计数器将重置为 0,以便仅计算连续报告为 0小时。
该表格始终预先填充用户的预期报告期数量。即如果用户预计报告 6 个月的小时数,我们在此表中创建 6 行,在 HOURS_REPORTED 字段中使用 NULL。
这是一个 PLSQL 示例。
FUNCTION FN_NIL_RPT_CNT ( PI_USER_ID IN NUMBER )
RETURN NUMBER
IS
LV_NIL_CNT NUMBER := 0;
CURSOR CR_DTLS IS
SELECT YEAR
,MONTH
,HOURS_REPORTED
FROM HOURS
WHERE STATUS = 'CURRENT'
AND USER_ID = PI_USER_ID
ORDER BY TO_DATE(MONTH||YEAR, 'mmyyyy');
BEGIN
FOR LR_HR IN CR_DTLS
LOOP
EXIT WHEN TO_DATE(LR_HR.MONTH||LR_HR.YEAR,'mmyyyy') >= TRUNC(SYSDATE,'MM');
IF LR_HR.HOURS_REPORTED IS NOT NULL
THEN
IF LR_HR.HOURS_REPORTED = 0
THEN
LV_NIL_CNT := LV_NIL_CNT + 1;
ELSE
LV_NIL_CNT := 0;
END IF;
ELSE
NULL; -- ignore
END IF;
END LOOP;
END;
RETURN LV_NIL_CNT;
END FN_NIL_RPT_CNT;
因此,如果光标包含以下内容,则预期结果将为 2,因为在 2019/10 年报告了小时数,这会将计数器重置为 0,并且随后的 2 个月报告了 0 小时。
【问题讨论】:
-
您想要报告的连续“0”小时数。作为您展示的示例,如果小时数为 1,0,0,1,0,0,则预期输出是什么
-
@GeorgeJoseph 假设这些数字按年份和月份的升序排列,则计数应显示为 2,因为过去两个月报告了 0,因为 3 个月前报告的 1 将重置计数到 0
标签: sql oracle window-functions