我正在尝试将今天的结果与前一个工作日的结果进行比较,例如:
select * from T1 where ASOF = trunc(sysdate)
select * from T2 where ASOF = trunc(sysdate-1)
select t1.asof, t1.Count-t2.count as difference from T1,T2但是如果有周末,我需要动态地将今天的结果与上一个工作日(星期五)进行比较,我可以将其写为ASOF = trunc(sysdate-3),但这将是硬编码,不会在上一个工作日工作。
发布于 2021-04-05 10:52:18
如果您有一个没有例外的好规则来标识工作日,那么可以使用Q1的CTE。
With QWD1 as (
-- select working days here ...
-- ... cdt = current working date col
),
QWD2 as (
-- select working days and prev working day for that day via LAG()...
select
-- ... cdt = current working date col
cdt,
-- ... pdt = prev working date col
lag(cdt, 1) over (order by cdt) as pdt
from QWD1
order by cdt
)
SELECT
t1.cdt as asof,
t1.count-t2.count as Count_Difference
from QWD2 t1, QWD2 t2
where t2.cdt = t1.pdt
;如果你没有一个好的规则来识别工作日……比如,“如果超过8个人带着糟糕的卫生习惯来到办公室,那么当天的工作就会被取消”……然后为QWD1使用一个表,并根据需要填充它。对新表使用上面的查询,而不是QWD1的CTE,查询的其余部分将包含QWD2、final select等。
HTH Shankar
发布于 2021-04-05 17:42:59
您可以使用依赖于当前星期几的CASE语句来解决此问题:
SELECT trunc(sysdate) -
CASE TO_CHAR(sysdate, 'fmDy', 'NLS_DATE_LANGUAGE = ENGLISH')
WHEN 'Mon' THEN 3
WHEN 'Tue' THEN 1
WHEN 'Wed' THEN 1
WHEN 'Thu' THEN 1
WHEN 'Fri' THEN 1
WHEN 'Sat' THEN 1
WHEN 'Sun' THEN 2
END
FROM DUAL;我将两个时间戳(午夜和最后一个工作日)都存储在两个变量中,以保持一致性和更好的可读性,但出于演示目的,您可以将其添加到查询中:
SELECT * FROM employee AS OF TIMESTAMP
trunc(sysdate) -
CASE TO_CHAR(sysdate, 'fmDy', 'NLS_DATE_LANGUAGE = ENGLISH')
WHEN 'Mon' THEN 3
WHEN 'Tue' THEN 1
WHEN 'Wed' THEN 1
WHEN 'Thu' THEN 1
WHEN 'Fri' THEN 1
WHEN 'Sat' THEN 1
WHEN 'Sun' THEN 2
END;https://stackoverflow.com/questions/66947519
复制相似问题