根据最新的创建日期显示id的唯一值

时间:2014-08-22 11:52:10

标签: sql sql-server subquery maxdate

我使用以下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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

最简单的方法是使用CTEROW_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 *明确地列出所有列,我不喜欢它)