2017-06-19 60 views
1

首先,如果標題沒有意義,但以下是詳細的情景,我表示歉意。根據其他記錄過濾表格的記錄

說我有一個document_revision

id document_id phase_id user_id 
1 1   3   1 
2 1   2   1 
3 1   1   1 
4 2   3   2 
5 2   2   2 

其中phase_id是:轉錄= 3;證明= 2;並提交= 1.

我想編寫一個查詢,我可以過濾修訂記錄,如果同一個用戶做了轉錄和證明,我將忽略證明階段。所以輸出將是:

id document_id phase_id user_id 
1 1   3   1 
3 1   1   1 
4 2   3   2 

我一直在掙扎幾個小時搞清楚這個查詢,但沒有運氣到目前爲止。

回答

2

假設你只想要其中user_ID的參與階段2和3,然後一個辦法可以做到這一點是ROW_NUMBER()任何情況下,如第3階段:

DECLARE @T TABLE (ID INT IDENTITY(1, 1), Document_ID INT, Phase_ID INT, [User_ID] INT); 

INSERT @T (Document_ID, Phase_ID, [User_ID]) VALUES 
(1, 1, 1), (1, 2, 1), (1, 3, 1), (2, 3, 2), (2, 2, 2), (3, 1, 1), (3, 2, 1), (3, 3, 2); 

SELECT ID, Document_ID, Phase_ID, [User_ID] 
FROM 
(
    SELECT *, RN = ROW_NUMBER() OVER (PARTITION BY Document_ID, [User_ID], CASE WHEN Phase_ID IN (2, 3) THEN 2 ELSE Phase_ID END ORDER BY Phase_ID DESC) 
    FROM @T 
) AS T 
WHERE RN = 1; 
+0

太棒了!這個伎倆。我不知道'ROW_NUMBER()'可以是有用的。謝謝! – mcspiral

1
DECLARE @document_revision TABLE (
    id INT IDENTITY(1,1), 
    document_id INT, 
    phase_id INT, 
    user_id INT 
); 

INSERT INTO @document_revision 
(document_id, phase_id, user_id) 
VALUES 
    (1, 3, 1), 
    (1, 2, 1), 
    (1, 1, 1), 
    (2, 3, 2), 
    (2, 2, 2), 
    -- To test a scenario where there is a proof and a submit with no transcribe phases and same document 
    (3, 2, 3), 
    (3, 1, 3), 
    -- To test a scenario where there is a transcribe and a submit with no proof phases and same document 
    (4, 3, 4), 
    (4, 1, 4), 
    -- To test a scenario where there is a proof and a submit with no transcribe phase (for document_id 5) but different document and same user as above 
    (5, 2, 4); 

SELECT dr.id 
     , dr.document_id 
     , dr.phase_id 
     , dr.user_id 
FROM @document_revision AS dr 
WHERE NOT EXISTS ( SELECT 1 
        FROM @document_revision AS temp 
        -- Same user 
        WHERE temp.user_id = dr.user_id 
         -- Same document 
         AND temp.document_id = dr.document_id 
         -- To check if there is already a transcribe phase_id with the same user_id and document_id 
         AND temp.phase_id = 3 
         -- -- To check if there is already a proof phase_id with the same user_id and document_id 
         AND dr.phase_id = 2) 

結果:

id document_id phase_id user_id 
1 1   3   1 
3 1   1   1 
4 2   3   2 
6 3   2   3 
7 3   1   3 
8 4   3   4 
9 4   1   4 
10 5   2   4 
+0

如果你解釋一些答案可能會有所幫助。 OP的代碼有什麼問題?這是如何解決它的? – Gary99