Teradata中值为1的下一个日期行
我需要Teradata上的以下输出:Teradata中值为1的下一个日期行,teradata,Teradata,我需要Teradata上的以下输出: DATE_HOME WORKING_DAY 01/01/2018 0 02/01/2018 1 03/01/2018 1 04/01/2018 1 05/01/2018 1 06/01/2018 0 07/01/2018 0 08/01/2018 1 09/01/2018 1 Output required DATE_HOME WORKING_DAY Updated_DATE 01/01/2018 0 02/
DATE_HOME WORKING_DAY
01/01/2018 0
02/01/2018 1
03/01/2018 1
04/01/2018 1
05/01/2018 1
06/01/2018 0
07/01/2018 0
08/01/2018 1
09/01/2018 1
Output required
DATE_HOME WORKING_DAY Updated_DATE
01/01/2018 0 02/01/2018
02/01/2018 1 02/01/2018
03/01/2018 1 03/01/2018
04/01/2018 1 04/01/2018
05/01/2018 1 05/01/2018
06/01/2018 0 08/01/2018
07/01/2018 0 08/01/2018
08/01/2018 1 08/01/2018
09/01/2018 1 09/01/2018
天哪,这很难看,但似乎管用。我没有访问TD系统的权限,因此它比可能的更详细:
SELECT
date_home,
working_day,
CAST(
CASE
-- If current date is a non-work day, add appropriate number of days to non-work day to get next work-day
WHEN working_day = 0 THEN date_home + INTERVAL '1' DAY * (ROW_NUMBER() OVER(PARTITION BY update_date ORDER BY date_home DESC))
ELSE date_home
END
AS DATE) AS Update_date
FROM (
SELECT
date_home,
working_day,
CASE
-- If current and previous days were non-work days, group row by PrevWorkDay value
WHEN MIN(working_day) OVER(ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) = 0 AND working_day = 0 THEN MIN(PrevWorkDay) OVER(ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
ELSE PrevWorkDay
END AS Update_Date
FROM (
SELECT
date_home,
working_day,
CASE
-- Track "baseline" previous date_home value for new group of "non-work day" rows
WHEN COALESCE(MIN(working_day) OVER(ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), 1) = 1 AND working_day = 0 THEN COALESCE(MIN(Date_Home) OVER(ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), date_home)
ELSE NULL
END AS PrevWorkDay
FROM holiday_calendar
) src
) src
ORDER BY date_home
这假设您的源数据存储在名为“holiday_calendar”的表中
COALESCE用于处理结果集中的第一行,因为没有前一行,所以无法计算前一行的值
试试看,让我知道。对于
第一个值来说,这是一个简单的任务:
first_value(case when WORKING_DAY = 1 then DATE_HOME end ignore nulls)
over (order by DATE_HOME
rows between current date and unbounded following)
将非业务日期更改为NULL,然后搜索第一个非NULL值
编辑:
事实上,在按同一列排序时,不需要使用first\u value
,简单的min
也可以:
min(case when WORKING_DAY = 1 then DATE_HOME end)
over (order by DATE_HOME
rows between current date and unbounded following)
不清楚你想要什么。我假设工作日
代表一个工作日(即无假日)。什么是更新日期?您想如何推导更新日期?我假设日期格式也是DD/MM/YYYY?请添加更多详细信息。基本上工作日是0如果日期是假日,我在表中的前两列date_HOME和Working_Day指示符为1或0。我想推导出任何工作日的第三个字段更新日期=0,下一行的日期为工作日=1,如下日期为家庭工作日更新日期2018年1月1日2018年2月1日2018年2月1日2018年1月2日2018年1月1日2018年1月3日2018年1月1日2018年1月4日2018年1月1日2018年1月4日2018年1日2018年1月5日2018年1月1日2018年01月06日2018年01月08日2018年01月07日2018年01月08日2018年01月08日2018年01月08日2018年01月09日2018年01月09日2018年01月09日2018年01月09日明白了。那么,Updated_DATE
代表下一个“工作日”日期?是的,没错。因此,对于2018年3月30日耶稣受难节来说,应该是2018年4月3日,工作日=1现在就有意义了,谢谢。非常棒,谢谢馄饨。没问题。这是一种更好的方式。迪特,你太棒了:)我喜欢你的SQL技巧。过去我在Teradata的时候,你也帮了我很多。谢谢你的提示。