2017-06-19 76 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

相关问题