Teradata中值为1的下一个日期行

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/

我需要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/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的时候,你也帮了我很多。谢谢你的提示。