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

ステータスごとに1行が必要なため、基本的にステータス比較が欠落しています。

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

これは、(ほとんどの場合) テーブルを 1 回スキャンするだけで済むため、自己結合よりも高速です。

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 に答える