あなたはこれを行うことができます:
;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
た節に従って、グループごとに順序付けられます。サブクエリを使用する代わりにCTEを使用しました。ORDER BY
OVER
ORDER BY pih.PID
次に、私が使用した 、降順でランク付けされた同じレコードのグループごとに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