我有一个数据表,用于存储不同日期的不同商品的价格。

CREATE TABLE COMMODITIES(
    [MARKET_DATE] [datetime2](0) NOT NULL,
    [THE_TYPE] [numeric](2, 0) NOT NULL,
    [CLOSE_VALUE] [numeric](10, 4) NULL,
) ON [PRIMARY]

GO


MARKET_DATE保留交易日期(日期按升序排列,但不连续)

CLOSE_VALUE保持价格

THE_TYPE保存商品的类型。

每种商品的交易日期都不同。



我需要获取所有日期的列表,其中THE_TYPE = 1,带有价格,以及商品的相应价格,其中THE_TYPE = 2



如果每种商品的交易日期相同,我可以进行简单的联接(相当于Excel VLOOKUP (, false)

SELECT mr1.market_date
    ,mr1.close_value,mr2.close_value

FROM commodities mr1
LEFT JOIN commodities  mr2 ON mr1.market_date = mr2.market_date
    AND mr2.the_type = 2
WHERE mr1.the_type = 1




但是,由于交易日期不同,我需要查找与Excel VLOOKUP (, true)等效的非精确匹配-即mr2中的最大日期是在mr1.market_date之前或之前



我正在寻找一个整洁的解决方案。作为一种解决方法,我可以将中间日期输入到数据库中,这将起作用。或者,我可以执行以下操作

SELECT mr1.market_date
    ,mr1.close_value
    ,

            (SELECT top 1 close_value
            FROM commodities mr2

            where mr2.market_date <= mr1.market_date
                AND mr2.the_type = 2
                order by market_date desc
            ) AS close_value

FROM commodities mr1
WHERE mr1.the_type = 1


但我希望有一个更整洁(更快)的解决方案



例如,如果该表包含以下内容

MARKET_DATE CLOSE_VALUE  THE_TYPE
    2012-01-01  300  1
    2012-01-03  310  1
    2012-01-05  310  1
    2012-01-01  400  2
    2012-01-02  420  2
    2012-01-05  430  2


我会得到

2012-01-01  300  400
2012-01-03  310  420
2012-01-05  310  430

最佳答案

您可以使用CROSS APPLY。在这种情况下,它可能会稍快一些,但可能不会引起注意:

SELECT mr1.market_date
    ,mr1.close_value as close_value_1
    ,p.close_value as close_value_2
FROM commodities mr1
cross apply
  (SELECT top 1 close_value
        FROM commodities mr2
        where mr2.market_date <= mr1.market_date
            AND mr2.the_type = 2
            order by market_date desc) p
  WHERE mr1.the_type = 1


action中查看

关于sql-server - SQL Server 2012中的VLOOKUP样式查找,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17473735/

10-11 02:58