代码之家  ›  专栏  ›  技术社区  ›  falling_up

参考其他表格检查日期范围内的记录

  •  0
  • falling_up  · 技术社区  · 8 年前

    我正在处理一系列交易和库存收据。我的目标是创建一个标志,以查看公司是否在交易开始前5天收到该项目的发货。伪逻辑如下:

    For each transaction date: 
       For all inventory receipts whether inventory.item# = transaction.item#
           Are there records between transaction date - 5 and transaction date?
    

    通常,我只需要创建两个表并将它们连接起来,但它们实际上是两个独立的数据结构。我最初的尝试:

    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;
    

    但是我该如何引用这些表呢?我不确定左/右/内连接在这里是否合适。我并不是真的想加入这些行列,是吗?

    编辑: 我的数据结构如下:

    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项,我们将查看库存表,并看到该项在11月30日有收据,因此标志=1。对于0231项,我们发现在交易的五天内没有库存配方,因此标志=0。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Reeza    8 年前

    标准SQL查询在这里对我有效,但我不确定为什么您觉得标准连接不起作用。考虑到您布置的结构,它可以工作,并且与您的示例数据一起工作。如果你有重复的日期和项目,我不知道它会如何工作,但你没有包括在你的问题中,我必须假设你的样本数据反映了你的实际情况。

    假设表名为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;
    
    推荐文章