2017-05-31 53 views
2

我有这个下面的代码:查询来获取最古老的记录

;with cte as (
    Select RegardingObjectId , 
      DATEADD(mi, DATEDIFF(mi, getutcdate(), getdate()),CreatedON) as [Time First Response] 
      from dbo.Email 
    where DirectionCode = '1' 
) 
SELECT dbo.Incident.new_CaseID as [CASE ID], 
     cte.RegardingObjectId, 
     dbo.Incident.IncidentId, 
     dbo.Incident.Title as [SUBJECT], 
     dbo.Incident.StatusCode as [STATUS], 
     cte.[Time First Response] 
from dbo.Incident 
left Join cte on cte.RegardingObjectId = dbo.Incident.IncidentId 
order by dbo.Incident.new_CaseID desc 

这个查询将返回类似结果: Images

正如你可以看到,该查询返回与同一案件ID的多个记录。我想,对于每个多个记录有相同的案例ID,只有一个最古老的[时间第一反应]检索

+0

你有什么用,'MySQL'或'SQL-Server'? –

+0

@Geoman Yabes:对不起,它的sql服务器 – Icon

回答

2

你可以用你的查询在其他CTE和使用ROW_NUMBER优先,每位[CASE ID]最早的记录:

;with cte as (
    Select RegardingObjectId , 
      DATEADD(mi, DATEDIFF(mi, getutcdate(), getdate()),CreatedON) 
      as [Time First Response] 
      from dbo.Email 
    where DirectionCode = '1' 
), cte2 as (
    SELECT dbo.Incident.new_CaseID as [CASE ID], 
      cte.RegardingObjectId, 
      dbo.Incident.IncidentId, 
      dbo.Incident.Title as [SUBJECT], 
      dbo.Incident.StatusCode as [STATUS], 
      cte.[Time First Response], 
      ROW_NUMBER() OVER (PARTITION BY dbo.Incident.new_CaseID 
           ORDER BY cte.[Time First Response]) AS rn 
    from dbo.Incident 
    left Join cte on cte.RegardingObjectId = dbo.Incident.IncidentId 
) 
SELECT [CASE ID], 
     RegardingObjectId, 
     IncidentId, 
     [SUBJECT], 
     [STATUS], 
     [Time First Response] 
FROM cte2 
WHERE rn = 1 
ORDER BY [CASE ID] desc 
+0

ORDER BY cte。[Time First Response]不应该是DESC,因为他想得到“最老”的记录? –

+1

@MarcGuillot'DESC'将获取*最新*记录。这是我在查询中最初的内容,但后来我再次查看了这个问题。 –

+0

Ups,你是对的:-)。 –

0

您可以尝试使用MIN功能

;with cte as (
    Select RegardingObjectId , 
      DATEADD(mi, DATEDIFF(mi, getutcdate(), getdate()),CreatedON) as [Time First Response] 
      from dbo.Email 
    where DirectionCode = '1' 
) 
SELECT dbo.Incident.new_CaseID as [CASE ID], 
     cte.RegardingObjectId, 
     dbo.Incident.IncidentId, 
     dbo.Incident.Title as [SUBJECT], 
     dbo.Incident.StatusCode as [STATUS], 
     cte.[Time First Response] 
from dbo.Incident 
left Join cte on cte.RegardingObjectId = dbo.Incident.IncidentId 
AND cte.[Time First Response] IN (SELECT MIN(cte.[Time First Response]) 
FROM cte WHERE cte.RegardingObjectId = dbo.Incident.IncidentId) 
order by dbo.Incident.new_CaseID desc