【发布时间】:2014-05-22 18:46:37
【问题描述】:
我希望使用表 A 并创建类似于表 B 的东西,但基于表 C 中包含的任意拆分日期集。
例如,(注意 start_date = inception_date 并不总是正确的,因此必须保留 inception_date 而不是从 start_date 派生;这实际上代表了属于该句点的数百个字段)
我在 SAS 工作,但我希望能够使用 PROC SQL 编写此内容。我认为这样做的一种方法是为表 C 中的记录对创建多个表(包括最后的空值),然后将它们合并在一起。
伪代码示例:
for each record of table_c, concoct the pairs { (., 01-Jan-2012), (01-Jan-2012, 01-Jul-2012), (01-Jul-2012, 01-Jan-2013), (01-Jan-2013, .) }
以下查询可能需要围绕split_date1 和split_date2 进行一些空测试:
CREATE TABLE subquery1 AS
SELECT
a.customer_id
,max(a.start_date, x.split_date1) AS start_date
,min(a.end_date, x.split_date2 - 1) AS end_date
,a.inception_date
FROM table_a AS a
JOIN split_date AS x
;
.... (do for each pair of split dates, and then union all these tables together with some WHERE querying to throw away the nonsensical rows) to produce table_b. The image above indicates which subquery would generate which rows in table_b
请帮我填补空白,或提出替代方法。
table_a:
customer_id start_date end_date inception_date
aaa 18-Jun-11 17-Jun-12 18-Jun-11
aaa 18-Jun-12 17-Jun-13 18-Jun-12
bbb 13-Jul-11 12-Jul-12 13-Jul-11
ccc 14-May-11 13-Nov-11 14-Jul-11
ddd 21-Jun-11 20-Jun-12 21-Jun-11
table_b:
customer_id start_date end_date inception_date subquery
aaa 18-Jun-11 31-Dec-11 18-Jun-11 (1)
aaa 01-Jan-12 17-Jun-12 18-Jun-11 (2)
aaa 18-Jun-12 30-Jun-12 18-Jun-12 (2)
aaa 01-Jul-12 31-Dec-12 18-Jun-12 (3)
aaa 01-Jan-13 17-Jun-13 18-Jun-12 (4)
bbb 13-Jul-11 31-Dec-11 13-Jul-11 (1)
bbb 01-Jan-12 30-Jun-12 13-Jul-11 (2)
bbb 01-Jul-12 12-Jul-12 13-Jul-11 (3)
ccc 14-May-11 13-Nov-11 14-May-11 (1)
ddd 21-Jun-11 31-Dec-11 21-Jun-11 (1)
ddd 01-Jan-12 20-Jun-12 21-Jun-11 (2)
table_c:
split_dates
01-Jan-12
01-Jul-12
01-Jan-13
【问题讨论】:
-
另外,我要指出的是,这在 SQL 中可能是合理可行的(这在技术上当然是可行的),但在数据步骤中您肯定会更轻松。您可以在数据步骤中用非常少的代码行来执行此操作,然后遍历数据,而在 SQL 中,您将不得不处理数据然后合并事物(您的一般策略在那里是合理的)。
-
如果您尝试使用 SQL,因为这将是更大 SQL 流程中的一个步骤,您可以考虑使用 SAS datastep 视图,在这种情况下,您可以直接在其他 SQL 流程中使用它.
-
我很高兴看到 DATA 步解决方案,请随时发布。这可能对测试有用 - 我对 DATA 步骤不太熟悉,因为我是 SQL