Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2012中的VLOOKUP样式查找_Sql Server_Tsql - Fatal编程技术网

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