Sql server SQL Server 2012中的VLOOKUP样式查找
我有一个数据表,其中存储了不同日期不同商品的价格Sql server SQL Server 2012中的VLOOKUP样式查找,sql-server,tsql,Sql Server,Tsql,我有一个数据表,其中存储了不同日期不同商品的价格 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保留交易日期。日期按升序排列,但不连续 收盘价决定价格 _类型保存商品的类型 每种商品
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保留交易日期。日期按升序排列,但不连续
收盘价决定价格
_类型保存商品的类型
每种商品的交易日期不同
我需要得到一个所有日期的列表,其中包含价格,以及商品类型为2的对应价格
如果每种商品的交易日期相同,我可以做一个简单的连接,相当于excelvlookup,false
但是,由于交易日期不同,我需要寻找与Excel VLOOKUP等价的非精确匹配,即mr2中的最大日期,即mr1.market_日期当天或之前
我正在寻找一个简洁的解决方案。作为一种解决方法,我可以将中间的日期输入到数据库中。或者我也可以做下面的事情
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
你可以用交叉申请。在这种情况下,速度可能稍快,但可能不明显:
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
请参见您到底在寻找什么?您可以发布一个小的输入以及预期输出的示例吗?您可以移动选择。。。接近内部联接的值。但我怀疑这会对沙卡尔佩什的死刑执行时间产生如此大的影响。请参阅更新的问题以获取示例。看起来您正在尝试进行分组最大化。请看这个问题:我认为相关子查询是一个很好的解决方案。或者,您可以将其写入外部应用程序,以提高可读性。这并不能确保选择的值是具有最接近日期的值,而只是最大值one@Lamak如果您从我看到的最大mr2.market_日期中取最大值,那么您取的是最大关闭_值,与最大mr2.market_日期无关,谢谢!顺便说一句,有一个小的打字分区应该是分区BY非常感谢这一点。它看起来确实很优雅,但对我来说,它的工作速度非常慢,特别是当我需要申请第二个或第三个表时。+1用于向我介绍SQLFiddle,将从中得到很多好处。这个解决方案也很有效:PThanks-这个有效,但正如你预测的那样,我只得到了18秒而不是19秒的边际速度提升。我的案例涉及一个大约40000行的表,交叉应用/子查询应用了大约10次。我在问题中给出了简化的案例。我会尝试将maxclose_值作为maxclose_值,而不使用顺序By,但我需要的是最大日期的close_值,而不是最大close_值
WITH OrderedOrders AS
(
SELECT mr1.market_date
,mr1.close_value as mr1close
,mr2.close_value as mr2close
,ROW_NUMBER() OVER (PARTITION BY mr1.market_date ORDER BY mr2.market_date desc) AS RowNumber
FROM commodities mr1
JOIN commodities mr2
ON mr2.market_date <= mr1.market_date
AND mr2.the_type = 2
AND mr1.the_type = 1
)
SELECT market_date, mr1close, mr2close
FROM OrderedOrders
WHERE RowNumber = 1
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