我有一个数据表,用于存储不同日期的不同商品的价格。
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/