我将首先尝试在抽象层面解释问题:
我有X个数据作为输入,总是有一个字段DATE。以前,输入的日期(在某个过程之后)放在表中作为输出。现在,我被要求将输入日期和任何日期都放在收到的最小日期和那一刻之间的一年之间。如果这两个日期之间某天最初没有输入,则所有字段必须为0或等效字段。
实施例。我有两个输入。其中一个是' 18/03/2017'以及其他与' 18/03/208'。我现在需要为“2017年8月18日”之间的所有缺失日期创建输出数据。和' 18/04/2017'。因此,输出' 2017年3月30日'每个字段为0,而20和21等相同,等等。
我知道以编程方式执行此操作,但在powercenter上我没有。我被告知要做以下事情(我已经完成了,但我想知道更好的方法):
获取最小日期,第0天。然后,使用聚合器创建365个字段,每个字段都包含" day0" + 1,day0 + 2,依此类推,以创建一个人工年份。
之后我们会做几个转换,比如排序日期,它们之间的联合,以便为加入者准备好数据。加入者的想法是在原始数据和将所有字段都为0并且我们从之前的聚合器获得的数据之间进行完全外连接。
然后路由器选择其中一个组具有实际日期的数据(和没有空值的字段)和其他所有字段为空的组,然后将所述字段赋予0以最终写入表。 / p>
我想知道如何才能实现这一点,首先,无需将365天添加到日期。如果我在同一个过程中完成同样的过程10年,那么这个任务就会很快变得荒谬。
我想知道一个XOR类型的操作,或者其他一些函数会减少需要完成的步骤数量,因为我(可能错误地)认为这是一项简单的任务。目前我现在需要5个步骤才能知道两个日期之间缺少哪些日期,从那时起最少和一年。
我试图尽可能清楚但如果我在任何时候都失败了,请告诉我!
答案 0 :(得分:1)
我不确定聚合器应该做什么? 同样的'全外部'加入?常量端口上的正常连接很好:) c
你能算出所需数量的'''''''''''''''''''''''在加入者之前#?在这种情况下,查找配置为返回所有行'并且一个小于或等于谓词可以帮助使映射更具可读性。
在任何情况下,您都需要一个辅助表(或文件),其数字序列介于1和潜在的共享数(或更多)之间 我在仓库中使用我们的时间维度,它从1753-01-01每天有一行,下一天有200000,以及一个值为1及以上的主整数列......
答案 1 :(得分:1)
您已经确定您知道如何以编程方式执行此操作并且公平地说这个问题更适合这种解决方案......但这并不能以任何方式排除电力中心,只需提供2将日期转换为java转换,应用一些代码来生成它们之间的所有日期,并为每个日期输出记录。 Java转换是记录生成的理想选择
答案 2 :(得分:0)
您已经确定您知道如何以编程方式执行此操作并且公平地说这个问题更适合这种解决方案......但这并不能以任何方式排除电力中心,只需提供2将日期转换为java转换,应用一些代码来生成它们之间的所有日期,并为每个日期输出记录。 Java转换是记录生成的理想选择
好的...所以你可以覆盖你的源限定符来在选择查询本身实现这一点(我将基于Oracle的例子作为我以前的例子,我假设你的数据是来自一张桌子)。我在这里查找了连接语法
SQL to generate a list of numbers from 1 to 100
SELECT(MIN(tablea.DATEFIELD)+ levquery.n - 1)AS Port1 FROM tablea,(SELECT LEVEL n FROM DUAL CONNECT BY LEVEL< = 365)as levquery
(检查查询是否适合您 - 无法访问电脑以便在一分钟内进行测试)