代码之家  ›  专栏  ›  技术社区  ›  Peter Connolly

根据另一个表中的日期向查询添加其他列

  •  0
  • Peter Connolly  · 技术社区  · 7 年前

    我想询问 数据TBL 表,并根据 开始\u日期 的值 产品STBL 桌子

    下面,我创建了一个带有初始表(datatbl\u before)和所需最终结果(datatbl\u after)的模式,其中 Product\u查找 列已添加到 数据TBL 表和显示了相应的 产品 产品STBL 基于 Asset\u ID 线路和 开始\u日期

    例如,在 数据TBL ,行与Asset\u ID“1”相关,发生于2017年8月16日,这将从 产品STBL 表,因为它位于 开始\u日期 2017年8月12日,但在下一个 开始\u日期 2017年9月27日与该资产ID相关的价值。

    如果Asset\u ID查找和start\u date没有进行日期,则可以返回“NONE”值,例如 数据TBL

    有人能就如何解决这一问题提供指导或建议吗?

    非常感谢!

    CREATE TABLE datatbl_before (
        PDate DATE,
        Asset_ID varchar(255),
        Rev int
    );
    CREATE TABLE datatbl_after (
        PDate DATE,
        Asset_ID varchar(255),
        Rev int,
        Product_Lookup varchar(255)
    );
    
    CREATE TABLE productstbl (
        Asset_ID varchar(255),
        Start_date DATE,
        Product varchar(255)
    );
    
    INSERT INTO productstbl
    VALUES 
    ('  1  ','  2017-08-12' ,'  A'  ),
    ('  1'  ,'  2017-09-27' ,'  B'  ),
    ('  1'  ,'  2018-02-14' ,'  C'  ),
    ('  2'  ,'  2018-01-17' ,'  A'  ),
    ('  2'  ,'  2018-02-21' ,'  B'  ),
    ('  2'  ,'  2018-03-05' ,'  C'  );
    
    INSERT INTO datatbl_before
    VALUES 
    ('  2017-08-16' ,'  1'  ,'  10'),
    ('  2017-09-29' ,'  1'  ,'  15'),
    ('  2018-02-13' ,'  1'  ,'  12'),
    ('  2018-02-19' ,'  1'  ,'  10'),
    ('  2018-01-01' ,'  2'  ,'  12'),
    ('  2018-01-25' ,'  2'  ,'  33'),
    ('  2018-02-25' ,'  2'  ,'  67'),
    ('  2018-03-07' ,'  2'  ,'  71');
    
    INSERT INTO datatbl_after
    VALUES 
    ('  2017-08-16' ,'  1'  ,'  10' ,'  A'  ),
    ('  2017-09-29' ,'  1'  ,'  15' ,'  B'  ),
    ('  2018-02-13' ,'  1'  ,'  12' ,'  B'  ),
    ('  2018-02-19' ,'  1'  ,'  10' ,'  C'  ),
    ('  2018-01-01' ,'  2'  ,'  12' ,'  NONE'),
    ('  2018-01-25' ,'  2'  ,'  33' ,'  A'  ),
    ('  2018-02-25' ,'  2'  ,'  67' ,'  B'  ),
    ('  2018-03-07' ,'  2'  ,'  71' ,'  C'  );
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   DancingFool    7 年前

    您可以使用子查询,该子查询使用where子句中外部查询的数据来选择所需的数据。在这种情况下,它会找到所有正确资产的产品,并在交易日期之前或当天开始,对它们进行排序,以便最新的产品是第一个(我们想要的),并且只取该产品(前1部分)。

    ISNULL部分将任何缺少的值从NULL更改为“NONE”

    Select DB.*, 
        ISNULL(
            (Select top 1 product 
                from productstbl 
                where Asset_ID = DB.Asset_ID 
                    and Start_date <= DB.PDate 
                order by Start_date desc
            )
        , 'NONE') as Product_Lookup
    from datatbl_before DB;