Sql 获取可加入基于日期排列的ASC表的第一个日期(最大日期)
我有一组数据,在这些数据下面,我创建了一组数据来模拟我的实时数据。我试图从标准成本CTE中提取基于日期升序的最新标准成本,其中考虑的日期仅为库存交易日期之前的日期。到目前为止,我得到的是这个,根据执行计划,它是有效的,但效率不是很高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
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
;