SQL Server获取Max记录

时间:2012-08-10 01:25:06

标签: sql-server-2008

我有以下

(SELECT 
    ts.PID, 
    tt.ID, 
    tt.ItemOrder,
    tt.DisplayVal as Task, 
    tt.Responsible as  ResParty, 
    tt.DaysDue, 
    DATEADD(day, tt.DaysDue, PgStartDate) as DueDate,
    ts.spate As ActualDate , 
    ps.PgStartDate as ProgramDate
FROM tblTimeline tt 
CROSS JOIN tblSers ts
JOIN PG ps ON ps.PID = ts.PId
WHERE tt.ID = 2 
AND ps.cancelled = 0 ) 

t1
INNER JOIN(

SELECT 
    ts.PID,  
    max(DATEADD(day, tt.DaysDue, PgStartDate)) as DueDate 
FROM tblTimeline tt 
CROSS JOIN tblSers ts
JOIN PG ps on ps.PID = ts.PId
WHERE tt.ID = 2 
AND ps.cancelled = 0) 

t2
  ON t1.PID = t2.PID 
  AND t1.DueDate = t2.DueDate

t1中,对于给定的行,我的PID, DueDate重复。

我想获取每个PID的完整行,我想显示具有最大DueDate的行。

我在t1,t2

附近得到的语法不正确

2 个答案:

答案 0 :(得分:1)

您似乎错过了GROUP BY以及初始SELECT声明的开头:

SELECT *  --missing this
FROM      --missing this
(
  select ts.PID, 
     tt.ID, 
     tt.ItemOrder,
     tt.DisplayVal as Task,
     tt.Responsible as  ResParty, 
     tt.DaysDue, 
     DATEADD(day, tt.DaysDue, PgStartDate) as DueDate,
     ts.spate As ActualDate , 
     ps.PgStartDate as ProgramDate
  from tblTimeline tt 
  cross join tblSers ts
  join PG ps on ps.PID = ts.PId
  where tt.ID = 2 and ps.cancelled = 0 
) t1
inner join 
(
  select ts.PID,  
    max(DATEADD(day, tt.DaysDue, PgStartDate)) as DueDate 
  from tblTimeline tt cross join tblSers ts
  join PG ps 
    on ps.PID = ts.PId
  where tt.ID = 2 and ps.cancelled = 0 
  GROUP BY ts.PID   --missing this
) t2
  on t1.PID = t2.PID 
  and t1.DueDate = t2.DueDate

答案 1 :(得分:0)

你错过了分组依据。

select ts.PID,  max(DATEADD(day, tt.DaysDue, PgStartDate)) as DueDate 
   from tblTimeline tt cross join tblSers ts
   join PG ps on ps.PID = ts.PId
   where tt.ID = 2 and ps.cancelled = 0
   group by ts.PID