0

ある組織が、他の従業員に年次レビューを行うよう従業員を割り当てているとします。各 ReviewID (従業員) は、複数の employeeID によってレビューを受けることができます。従業員は、特定の reviewID がすべての自分の reviewID を完了した場合、または保留中の reviewID がない場合にのみ、レビューを開始または実行できます。サンプル データ コード:

    CREATE TABLE FindOrder
    (
    EmployeeID int
    ,ReviewID int
    )
     insert findorder
    values (1,3), (1,10), (1,12), (2,3), (2,5), (2,7), (3,0), (4,6), (5, 3), (6,0),      (7,0), (10,0), (12,5)

レビューするものが何もない (ReviewID=0) EmployeeID は、リストの最初のセット (3、6、7、10) にする必要があります。今すぐレビューを開始できる EmployeedID は 4,5 (私の 2 番目のセットにする必要があります) です。保留中の ReviewID を持たない 6、3 をレビューする必要があるためです。1 には reviewID 12 があり、すべてのレビューを完了していないため、employeeID 1 または 2 はありません。など... まだはっきりしない場合はお知らせください。レベル 0 が (6,10,7,3)、レベル 1 が (5, 4)、レベル 2 が (2, 12)、レベル 3 が (1) のような順序レベルを見つけたいと考えています。

注文を見つけるためにこのcteを試しました:

;WITH CTE AS
(
SELECT EmployeeID, ReviewID, 0 AS [Level] FROM FindOrder WHERE NETOUT = '0'
UNION  ALL
SELECT NN.EmployeeID, NN.ReviewID, [Level]+1  FROM FindOrder nn
JOIN CTE ON NN.ReviewID=CTE.EmployeeID
)
SELECT *  FROM CTE

しかし、レベル 1 とレベル 3 で Employeeid 1 を取得します。従業員 1 がレビューしなければならないすべての従業員がレビューを完了していないため、EmployeeID 1 はレベル 1 に入るべきではありません。一般に、上記の再帰クエリの新しいデータ サブセットは、EmployeeID 1 と 2 をフィルタリングする必要があります。

4

1 に答える 1

1

あなたのレベルは、実際には、特定の従業員に必要なレビューの最長パスである必要があるようです. たとえば、従業員1には次のパスがあります...

1->3
1->10
1->12->5->3

この従業員のレベルは最長のパスであり、私があなたの質問を理解していれば、あなたが気にかけているのは 1 つだけです。これを試して...

;WITH CTE AS
(
SELECT EmployeeID, ReviewID, 0 AS [Level] FROM FindOrder WHERE ReviewId = '0'
UNION  ALL
SELECT NN.EmployeeID, NN.ReviewID, [Level]+1  FROM FindOrder nn
JOIN CTE ON NN.ReviewID=CTE.EmployeeID
)
SELECT EmployeeId, MAX(Level) AS Level FROM CTE 
GROUP BY EmployeeID
ORDER BY MAX(Level)
于 2013-08-29T21:23:11.667 に答える