从id获取最新日期

时间:2012-12-20 08:52:36

标签: sql-server-2008

我运行上面的sql语句,我得到了这个。[IMG] http://i1093.photobucket.com/albums/i422/walkgirl_1993/asd-1_zps5506632e.jpg [/ IMG]我正在尝试显示最新日期你可以看到3和4.对于caseid 3,它应该显示最新的一行,即2012-12-20 16:12:36.000。我尝试使用group by,order by。谷歌一些网站说使用排名,但我不确定排名,因为我真的没有排名。一些建议?

select [Case].CaseID, Agent.AgentName, Assignment.Description, A.AgentName as EditedBy, A.DateEdited from Agent inner join [Case-Agent] on [Case-Agent].AgentID = Agent.AgentID inner join [Assignment] on Assignment.AssignmentID = [Case-Agent].AssignmentID inner join [Case] on [Case].CaseID = [Case-Agent].CaseID inner join (select EditedCase.CaseID, [EditedCase].DateEdited, [Agent].AgentName from EditedCase inner join [Agent] on [Agent].AgentID = [EditedCase].AgentID) A on A.CaseID = [Case].CaseID where [Assignment].AssignmentID = 0 

2 个答案:

答案 0 :(得分:0)

要使用RANK执行此操作,您只需将RANK添加到子查询并获取每个CaseID和Agent的DateEdited排名,然后在主查询中将WHERE子句放入仅选择排名为1的行。我认为我的分区条款是正确的 - 没有看到你的数据就有点困难。

像这样:

SELECT 
  [Case].CaseID 
  ,Agent.AgentName 
  ,Assignment.Description 
  ,A.AgentName AS EditedBy 
  ,A.DateEdited 
FROM Agent 
  INNER JOIN [Case-Agent] ON [Case-Agent].AgentID = Agent.AgentID 
  INNER JOIN [Assignment] ON Assignment.AssignmentID = [Case-Agent].AssignmentID 
  INNER JOIN [Case] ON [Case].CaseID = [Case-Agent].CaseID 
  INNER JOIN (SELECT 
                EditedCase.CaseID 
                ,[EditedCase].DateEdited 
                ,[Agent].AgentName
                ,RANK ( ) OVER (PARTITION BY EditedCase.CaseID, [Agent].AgentName 
                               ORDER BY [EditedCase].DateEdited DESC ) AS pos
              FROM EditedCase 
                INNER JOIN [Agent] on [Agent].AgentID = [EditedCase].AgentID) A on A.CaseID = [Case].CaseID 
WHERE [Assignment].AssignmentID = 0 
  AND pos = 1

您还可以将子查询更改为聚合查询,以便返回MAX日期,如下所示:

SELECT 
  [Case].CaseID 
  ,Agent.AgentName 
  ,Assignment.Description 
  ,A.AgentName AS EditedBy 
  ,A.DateEdited 
FROM Agent 
  INNER JOIN [Case-Agent] ON [Case-Agent].AgentID = Agent.AgentID 
  INNER JOIN [Assignment] ON Assignment.AssignmentID = [Case-Agent].AssignmentID 
  INNER JOIN [Case] ON [Case].CaseID = [Case-Agent].CaseID 
  INNER JOIN (SELECT 
                EditedCase.CaseID 
                ,MAX([EditedCase].DateEdited) AS DateEdited 
                ,[Agent].AgentName
              FROM EditedCase 
                INNER JOIN [Agent] on [Agent].AgentID = [EditedCase].AgentID
              GROUP BY
                EditedCase.CaseID
                ,[Agent].AgentName) A on A.CaseID = [Case].CaseID 
WHERE [Assignment].AssignmentID = 0 
  AND pos = 1

答案 1 :(得分:0)

你走在正确的轨道上;你需要在这里使用排名函数,例如row_number()

with LatestCase as
(
  select [Case].CaseID
    , Agent.AgentName
    , Assignment.Description
    , A.AgentName as EditedBy
    , A.DateEdited
    , caseRank = row_number() over (partition by [Case].CaseID order by A.DateEdited desc)
  from Agent
    inner join [Case-Agent] on [Case-Agent].AgentID = Agent.AgentID
    inner join [Assignment] on Assignment.AssignmentID = [Case-Agent].AssignmentID
    inner join [Case] on [Case].CaseID = [Case-Agent].CaseID
    inner join
    (
      select EditedCase.CaseID
        , [EditedCase].DateEdited
        , [Agent].AgentName
      from EditedCase
        inner join [Agent] on [Agent].AgentID = [EditedCase].AgentID
    ) A on A.CaseID = [Case].CaseID where [Assignment].AssignmentID = 0
)
select *
from LatestCase
where caseRank = 1