1

私はこのクエリを持っています:

SELECT pih.PID, piv.TSV, piv.Variable_ID, piv.Value_ID, piv.Manual_Value
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

私はこれを手に入れます:

ここに画像の説明を入力してください
私の問題は、これらの行が、この時点で必要な用途のために重複していることです。DISTINCT TSVでのみ行を取得することは可能ですか?またはそのようなもの?

ありがとうございました

4

2 に答える 2

2

あなたはこれを行うことができます:

;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
于 2012-11-20T14:38:07.860 に答える
0

欲しいですか

SELECT pih.PID,  piv.Variable_ID, piv.Value_ID, piv.Manual_Value
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
group by
pih.PID,  piv.Variable_ID, piv.Value_ID, piv.Manual_Value
于 2012-11-20T15:34:55.560 に答える