你可以从“最后文件”这样的任意值:
SELECT
D.DocumentID,
D.Reference,
LastDocumentID = R.DocumentID
FROM
dbo.Documents D
OUTER APPLY (
SELECT TOP 1 *
FROM dbo.Documents R
WHERE
D.Reference = R.Reference
AND R.DocumentID < D.DocumentID
ORDER BY R.DocumentID DESC
) R
;
虽然具有相同的逻辑,在一个子查询WHERE
子句中计算刚刚列值类似的方法,这允许您从以前的文档中拉出多个列,并演示OUTER APPLY
。如果您想要等效的INNER
连接(不包括之前没有的行),请更改为CROSS APPLY
。
仅供参考,以下是实现此目的的单值方法。你基本上把包含在OUTER APPLY
到括号中的查询,并且只选择一列:
SELECT
D.DocumentID,
D.Reference,
LastDocumentID = (
SELECT TOP 1 R.DocumentID
FROM dbo.Documents R
WHERE
D.Reference = R.Reference
AND R.DocumentID < D.DocumentID
ORDER BY R.DocumentID DESC
)
FROM
dbo.Documents D
;
或者,您也可以只使用Max
:
SELECT
D.DocumentID,
D.Reference,
LastDocumentID = (
SELECT Max(R.DocumentID)
FROM dbo.Documents R
WHERE
D.Reference = R.Reference
AND R.DocumentID < D.DocumentID
)
FROM
dbo.Documents D
;
如果你使用SQL Server 2012及以上,你可以用它的更高级的语法来实现窗口化功能:
SELECT
D.DocumentID,
D.Reference,
LastDocumentID = Max(D.DocumentID) OVER (
PARTITION BY D.Reference
ORDER BY D.DocumentID ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
)
FROM
dbo.Documents D
;
你试过了什么? – 2015-02-23 20:55:26