Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 获取可加入基于日期排列的ASC表的第一个日期(最大日期)_Sql_Sql Server_Left Join - Fatal编程技术网

Sql 获取可加入基于日期排列的ASC表的第一个日期(最大日期)

Sql 获取可加入基于日期排列的ASC表的第一个日期(最大日期),sql,sql-server,left-join,Sql,Sql Server,Left Join,我有一组数据,在这些数据下面,我创建了一组数据来模拟我的实时数据。我试图从标准成本CTE中提取基于日期升序的最新标准成本,其中考虑的日期仅为库存交易日期之前的日期。到目前为止,我得到的是这个,根据执行计划,它是有效的,但效率不是很高 CREATE TABLE stdcosts (item varchar(20) not null, indt date not null, rev integer not null, [MC00.010] money default 0, [OC00.000] mo

我有一组数据,在这些数据下面,我创建了一组数据来模拟我的实时数据。我试图从标准成本CTE中提取基于日期升序的最新标准成本,其中考虑的日期仅为库存交易日期之前的日期。到目前为止,我得到的是这个,根据执行计划,它是有效的,但效率不是很高

CREATE TABLE stdcosts
(item varchar(20) not null,
indt date not null,
rev integer not null,
[MC00.010] money default 0,
[OC00.000] money default 0,
[GC00.025] money default 0,
[MS00.010] money default 0) ;

 INSERT INTO stdcosts
VALUES
('201226-03','02/26/2019',1,2000,0,100,50),
('201226-03','09/07/2019',2,700,0,0,50),
('201226-03','10/07/2019',3,500,0,20,10)

CREATE TABLE inventoryOH 
(item varchar(20) not null,
 warehouse varchar(8) not null,
 TransDate date not null,
 seq integer not null default 1,
 owner varchar(10) ,
 project varchar(10),
 orderID varchar(10),
 onHand integer default 0,
 Age bigint,
 costMethod varchar(15) ,
 WVG_flag varchar(1),
 WVG char(4),
  rowno int );

 INSERT INTO inventoryOH
 VALUES
 ('201226-03','B','6/18/2019',1,'','','NPO312979',5,134,'STANDARD','N','',1),
 ('201226-03','B','9/3/2019',1,'','','NPO315960',14,57,'STANDARD','N','',2),
 ('201226-03','B','9/23/2019',1,'','','SFC037624',1,37,'STANDARD','N','',3),
 ('201226-03','B','10/1/2019',1,'','','NPO316472',6,29,'STANDARD','N','',4);
输出:

SELECT i.*, s.*
FROM inventoryOH i
LEFT JOIN stdcosts s
    ON s.item = i.item
    AND s.indt <= i.TransDate
    AND s.rev IN (SELECT MAX(s1.rev)
                     FROM stdcosts s1
                      WHERE s1.item = s.item
                      AND s1.indt <= i.TransDate)
我想知道是否有人有办法使用排名/行号或其他方法来优化它,以使其运行更快

链接->

您可以使用外部应用来执行横向连接

对于inventoryOH中的每一行,我们需要从stdcosts中找到一行,该行具有相同的项,在TransDate时或之前具有indt,并且具有最大版本

为了使其有效工作,您应该在stdcosts表中创建一个关于项目的索引,indt include rev、[MC00.010]、[OC00.000]、[GC00.025]、[MS00.010]。索引中列的顺序很重要


我不确定rev值的逻辑应该是什么,但是如果您需要仅基于indt而不是基于rev的最新行,那么排序应该是按indt:ORDER by stdcosts.indt DESC。它还可以更有效地使用建议的索引。

这些表上的索引是什么?主键?库存-商品、仓库、交易日期、序列号、stdcosts-商品、版本-是否可以将索引和主键放入脚本中?仅仅列出这些列并没有多大帮助。。。。从标准成本角度来看。。。所以你没有表,你有视图?在我的查询中它不是视图,而是CTE。我做了编辑。
SELECT
    inventoryOH.*
    ,Costs.*
FROM
    inventoryOH
    OUTER APPLY
    (
        SELECT TOP(1)
            item
            ,indt
            ,rev
            ,[MC00.010]
            ,[OC00.000]
            ,[GC00.025]
            ,[MS00.010]
        FROM stdcosts
        WHERE
            stdcosts.item = inventoryOH.item
            AND stdcosts.indt <= inventoryOH.TransDate
        ORDER BY
            stdcosts.rev DESC
    ) AS Costs
;