我有3张桌子:Master,Paper和iCodes。对于一组Master.Ref,我需要找到Max(Paper.Date),其中Paper.Code也在iCodes表中(即Paper.Code是一种iCode)。 Master通过File字段加入Paper。
编辑: 我只需要Max(Paper.Date)其相应的代码;我不需要所有的代码。
我写了以下内容,但速度非常慢。我有几百个引号来寻找。有什么更好的方法呢?
SELECT Master.Ref,
Paper.Code,
mp.MaxDate
FROM ( SELECT p.File ,
MAX(p.Date) AS MaxDate ,
FROM Paper AS p
LEFT JOIN Master AS m ON p.File = m.File
WHERE m.Ref IN ('ref1', 'ref2', 'ref3', 'ref4', 'ref5', 'ref6'... )
AND p.Code IN ( SELECT DISTINCT i.iCode
FROM iCodes AS i
)
GROUP BY p.File
) AS mp
LEFT JOIN Master ON mp.File = Master.File
LEFT JOIN Paper ON Master.File = Paper.File
AND mp.MaxDate = Paper.Date
WHERE Paper.Code IN ( SELECT DISTINCT iCodes.iCode
FROM iCodes
)
答案 0 :(得分:0)
这样做你想要的吗?
SELECT m.Ref, p.Code, max(p.date)
FROM Master m LEFT JOIN
Paper
ON m.File = p.File
WHERE p.Code IN (SELECT DISTINCT iCodes.iCode FROM iCodes) and
m.Ref IN ('ref1','ref2','ref3','ref4','ref5','ref6'...)
GROUP BY m.Ref, p.Code;
编辑:
要获取最大日期的代码,请使用窗口函数:
select ref, code, date
from (SELECT m.Ref, p.Code, p.date
row_number() over (partition by m.Ref order by p.date desc) as seqnum
FROM Master m LEFT JOIN
Paper
ON m.File = p.File
WHERE p.Code IN (SELECT DISTINCT iCodes.iCode FROM iCodes) and
m.Ref IN ('ref1','ref2','ref3','ref4','ref5','ref6'...)
) mp
where seqnum = 1;
函数row_number()
将从1开始的序号分配给一组行。这些组由partition by
子句定义,因此在这种情况下,具有相同m.Ref
值的所有内容都将位于单个组中。在组内,根据order by
子句为行分配编号。因此,具有最大日期的那个获得值1.这是您想要的行。