あなたはこれを行うことができます:
;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.TSVORDER BY pih.PID DESC
これはどのように作動しますか:
ランキング関数ROW_NUMBER() OVER()は、 にリストされている同じ列を持つ各グループのランキング番号を提供します。このPARTITION BY場合、このランキング番号は、節内で定義されpiv.TSVた節に従って、グループごとに順序付けられます。サブクエリを使用する代わりにCTEを使用しました。ORDER BYOVERORDER BY pih.PID
次に、私が使用した 、降順でランク付けされた同じレコードのグループごとにWHERE rownum = 1ランキング番号が与えられたため、 のレコードが最小のレコードになります(考えてみてください)。rownumpiv.TSVrownum = 1pih.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