0

次の SQL コードを使用していくつかのテーブルを結合していますが、最新の s.createdate に基づいて s.incidentid の一意の値を表示する必要があります。

Maxdate で Sub クエリを使用する必要があることはわかっていますが、正しい構文についてはわかりません。

これは、複数の結合を使用した最初のクエリであり、理解するのに苦労しています。

これが私のコードです:

SELECT 
s.incidentid, 
u.internalid as AssignedTo, 
u.fullname as AssignedTo_FullName, 
s.createby as AssignedBy, 
u2.fullname as AssignedBy_FullName, 
s.createdate as AssignedTime, 
i.[description], 
i.fix,
st.[description] as [Status],
(SELECT (CASE WHEN u.internalid = s.createby THEN 'Yes' ELSE 'No' END) as SelfAssigned),
d.d1,
d.d2,
d.d3,
d.d4,
d.d5

FROM dbo.IncidentServiceLevelAgreement s
JOIN dbo.UserAll u on u.userid = s.userid
JOIN dbo.UserAll u2 on u2.internalid = s.createby
JOIN dbo.IncidentAll i on s.incidentid = i.incidentid
JOIN dbo.[Status] st on i.statusid = st.statusid
JOIN dbo.flatdiagnosis d on i.actualdiagnosisid = d.diagnosisid 
WHERE (s.groupId = '4954' and s.incidentServiceLevelAgreementTypeID = '9')
ORDER BY AssignedTime DESC

どんな助けでも大歓迎です。

4

1 に答える 1

2

最も簡単な方法は、 aCTEROW_NUMBER関数を使用することです。

WITH CTE AS
(
    SELECT RN = ROW_NUMBER() OVER ( PARTITION BY incidentid
                                    ORDER BY createdate DESC ),
       s.Incidentid, 
       u.Internalid     AS AssignedTo, 
       u.Fullname       AS AssignedTo_FullName, 
       s.Createby       AS AssignedBy, 
       u2.Fullname      AS AssignedBy_FullName, 
       s.Createdate     AS AssignedTime, 
       i.[Description], 
       i.Fix, 
       st.[Description] AS [Status], 
       SelfAssigned =  CASE WHEN u.Internalid = s.Createby 
                       THEN 'Yes' ELSE 'No' END, 
       d.D1, 
       d.D2, 
       d.D3, 
       d.D4, 
       d.D5 
    FROM   dbo.Incidentservicelevelagreement s 
       JOIN dbo.Userall u 
         ON u.Userid = s.Userid 
       JOIN dbo.Userall u2 
         ON u2.Internalid = s.Createby 
       JOIN dbo.Incidentall i 
         ON s.Incidentid = i.Incidentid 
       JOIN dbo.[Status] st 
         ON i.Statusid = st.Statusid 
       JOIN dbo.Flatdiagnosis d 
         ON i.Actualdiagnosisid = d.Diagnosisid 
    WHERE  ( s.Groupid = '4954' 
         AND s.Incidentservicelevelagreementtypeid = '9' ) 
)
SELECT * FROM CTE WHERE RN = 1
ORDER BY  AssignedTime DESC

(すべての列を明示的にリストする代わりにSELECT *、私はそれが好きではありませんでした)

于 2014-08-22T11:56:01.973 に答える