7

我有这样的桌子

DocumentID        | MasterStepID | StepNumber | RoleID | UserID     | Status
JIEP/TT/07/000174 | Approval1    |          1 |   NULL | 0006100022 |      1    
JIEP/TT/07/000174 | Approval1    |          2 |     12 | 0006199013 |      3    
JIEP/TT/07/000174 | Approval1    |          3 |     13 | 0006106426 |      3
JIEP/TT/07/000174 | Approval1    |          5 |     18 | 0006100022 |      3
JIEP/TT/07/000174 | Approval1    |          6 |     16 | 0006104115 |      6

我期待这样的结果

JIEP/TT/07/000174 | Approval1 | 1 | NULL | 0006100022 | 1
JIEP/TT/07/000174 | Approval1 | 5 |   18 | 0006100022 | 3
JIEP/TT/07/000174 | Approval1 | 6 |   16 | 0006104115 | 6

我尝试了这个查询,但它的返回不像我期望的那样

select  *
from    WF_Approval sr1
where not exists
        (
        select  *
        from    WF_Approval sr2 
        where   sr1.DocumentID = sr2.DocumentID and 
                (
                    sr1.StepNumber < sr2.StepNumber
                )
        )and MasterStepID = 'Approval1'
4

4 回答 4

9

您基本上只是缺少状态比较,因为您想要每个状态一行;

SELECT *
FROM WF_Approval sr1
WHERE NOT EXISTS (
    SELECT *
    FROM  WF_Approval sr2 
    WHERE sr1.DocumentID = sr2.DocumentID AND 
          sr1.Status = sr2.Status AND                  # <-- new line
          sr1.StepNumber < sr2.StepNumber
) AND MasterStepID = 'Approval1'

或重写为JOIN;

SELECT *
FROM WF_Approval sr1
LEFT JOIN WF_Approval sr2
  ON sr1.DocumentID = sr2.DocumentID 
 AND sr1.Status = sr2.Status
 AND sr1.StepNumber < sr2.StepNumber
WHERE sr2.DocumentID IS NULL
  AND sr1.MasterStepID = 'Approval1';

SQLfiddle 与这里的两个版本的查询

于 2012-10-14T05:46:17.443 回答
6

这应该比自连接更快,因为(很可能)只需要对表进行一次扫描。

select DocumentID, 
       MasterStepID, 
       StepNumber, 
       RoleID,
       UserID , 
       Status
from (
    select wf.*
           row_number() over (partition by wf.status order by wf.stepnumber desc) as rn
    from  WF_Approval wf
) t
where rn = 1
order by StepNumber
于 2012-10-14T08:03:24.750 回答
1

试试这个

SELECT T1.* FROM WF_Approval T1 
JOIN
(SELECT DISTINCT [Status], DocumentID, MAX(StepNumber) as [StepNumber] from WF_Approval 
GROUP BY DocumentID, [Status])  T2 
ON T1.DocumentID = T2.DocumentID AND T1.[Status] = T2.[Status]
AND T1.StepNumber = T2.StepNumber
ORDER BY StepNumber ASC, Status ASC


输出:

JIEP/TT/07/000174   Approval1   1   NULL    0006100022  1
JIEP/TT/07/000174   Approval1   5   18      0006100022  3
JIEP/TT/07/000174   Approval1   6   16      0006104115  6
于 2012-10-14T06:03:12.907 回答
-1

当前的简单表(Student_Course)是这样的,重复记录假设:

Sname   Sid
------------
Ravi    S001
Ravi    S001
Jack    S002
Jack    S002
Jack    S002
Guru    S003
Smith   S004
Arun    S005
Rajeev  S006

询问:

SELECT S.Sid, S.Sname, Count(*) As Occurance
FROM Student_Course AS S
GROUP BY S.Sid
HAVING Count(S.Sid) > 1
Order By Count(*) Desc Limit 1

输出:

Sid     Sname   Occurance
-------------------------
S002    Jack    3
于 2014-02-25T15:05:16.030 回答