你可以这样做:
;WITH CTE
AS
(
SELECT
pih.PID,
piv.TSV,
piv.Variable_ID,
piv.Value_ID,
piv.Manual_Value,
ROW_NUMBER() OVER (PARTITION BY piv.TSV ORDER BY pih.PID) rownum
FROM Process_Instance_Value AS piv
INNER JOIN Process_Instance_History AS pih ON piv.PID = pih.PID
WHERE piv.Variable_ID IN (SELECT Variable_ID
FROM someTable
WHERE Transition_ID = @someValue)
AND piv.PID = @someValue
)
SELECT *
FROM CTE
WHERE rownum = 1;
需要注意的是:,如果你想最大这将返回最低pih.PID
为每个不同的piv.TSV
,只需使用ORDER BY pih.PID DESC
代替。
这是如何工作的:
分级功能ROW_NUMBER() OVER()
将给予已在PARTITION BY
列出的同一列,在我们的例子piv.TSV
每个组排序号码,这个排名号码将被订购,用于每个组根据OVER
子句中定义的ORDER BY
子句,在本例中为ORDER BY pih.PID
。我使用了CTE而不是使用子查询。
然后我用WHERE rownum = 1
,因为排序号码rownum
给予每一组已在递减排序位列同piv.TSV
记录,然后与rownum = 1
记录将与最低pih.PID
记录(想想) 。
但是,您可以使用内得到同样的结果一起进行GROUP BY
像这样:
SELECT
pih.PID,
piv.TSV,
piv.Variable_ID,
piv.Value_ID,
piv.Manual_Value
FROM Process_Instance_Value AS piv
INNER JOIN
(
SELECT
TSV, MIN(PID) MinPID
FROM Process_Instance_Value
GROUP BY TSV
) piv2 ON piv.PID = piv2.MinPID
INNER JOIN Process_Instance_History AS pih ON piv.PID = pih.PID
WHERE piv.Variable_ID IN (SELECT Variable_ID
FROM someTable
WHERE Transition_ID = @someValue)
AND piv.PID = @someValue
pih.PID你想在其中检索呢? – Gerrat