参考其他 table 以检查日期范围内的记录
Reference other table to check records within date range
我正在处理一系列交易和库存收据。我的目标是创建一个标志,以查看是否在交易前最多 5 天公司是否收到了该项目的货物。伪逻辑如下:
For each transaction date:
For all inventory receipts whether inventory.item# = transaction.item#
Are there records between transaction date - 5 and transaction date?
通常,我会创建两个 table 并加入它们,但它们实际上是两个独立的数据 structures.My 初始尝试:
PROC SQL;
Create Table TABLE 1 AS
SELECT TRANSACTION.DATE,
SUM(CASE WHEN INVENTORY.DATE BETWEEN (TRANSACTION.DATE - 5 AND TRANSACTION.DATE) AND INVENTORY.ITEM = TRANSACTION.ITEM;
但是我如何引用 table 呢?我不确定 left/right/inner 联接在这里是否合适。我不是真的想加入 tables,是吗?
编辑:
我的数据结构如下:
TRANSACTION TABLE
ITEM DATE
0012 12/2
0231 12/3
0421 12/3
INVENTORY TABLE
0012 11/30
0231 12/4
0421 12/1
对于项目 0012,我们会查看库存 table 并发现该项目在 11 月 30 日有收据,因此标志 = 1。对于项目 0231,我们看到交易后五天内没有库存配方,所以flag = 0。
标准 SQL 查询适用于我,不确定为什么您认为标准连接不起作用。鉴于您布置的结构,它可以工作,并且可以使用您的示例数据。如果您有重复的日期和项目,我不确定它是如何工作的,但您没有将其包含在您的问题中,我必须假设您的样本数据反映了您的实际情况。
假设,Table 名字是 t1 和 t2:
proc sql;
create table want as
select t1.*, t2.date as date2,
case when not missing(t2.date) then 1
else 0
end as check_flag
from t1 as t1
left join t2 as t2
on t1.item=t2.item
and t2.date between t1.date-5 and t1.date;
quit;
我正在处理一系列交易和库存收据。我的目标是创建一个标志,以查看是否在交易前最多 5 天公司是否收到了该项目的货物。伪逻辑如下:
For each transaction date:
For all inventory receipts whether inventory.item# = transaction.item#
Are there records between transaction date - 5 and transaction date?
通常,我会创建两个 table 并加入它们,但它们实际上是两个独立的数据 structures.My 初始尝试:
PROC SQL;
Create Table TABLE 1 AS
SELECT TRANSACTION.DATE,
SUM(CASE WHEN INVENTORY.DATE BETWEEN (TRANSACTION.DATE - 5 AND TRANSACTION.DATE) AND INVENTORY.ITEM = TRANSACTION.ITEM;
但是我如何引用 table 呢?我不确定 left/right/inner 联接在这里是否合适。我不是真的想加入 tables,是吗?
编辑: 我的数据结构如下:
TRANSACTION TABLE
ITEM DATE
0012 12/2
0231 12/3
0421 12/3
INVENTORY TABLE
0012 11/30
0231 12/4
0421 12/1
对于项目 0012,我们会查看库存 table 并发现该项目在 11 月 30 日有收据,因此标志 = 1。对于项目 0231,我们看到交易后五天内没有库存配方,所以flag = 0。
标准 SQL 查询适用于我,不确定为什么您认为标准连接不起作用。鉴于您布置的结构,它可以工作,并且可以使用您的示例数据。如果您有重复的日期和项目,我不确定它是如何工作的,但您没有将其包含在您的问题中,我必须假设您的样本数据反映了您的实际情况。
假设,Table 名字是 t1 和 t2:
proc sql;
create table want as
select t1.*, t2.date as date2,
case when not missing(t2.date) then 1
else 0
end as check_flag
from t1 as t1
left join t2 as t2
on t1.item=t2.item
and t2.date between t1.date-5 and t1.date;
quit;