选择(最大)查询的其他列

时间:2013-06-16 22:04:04

标签: sql greatest-n-per-group

我的SQL代码正在返回Max t。[CreatedDateTime](见下文)给我正确的结果,但是我想添加一个额外的列t。[Owner]而不是在结果中显示[CreatedDateTime]但仍然将结果基于Max([t.CreatedDateTime])

SELECT i.[RecID] as AssigneeID, max(t.[CreatedDateTime]) CreatedDateTime
FROM Incident as i
Join Task as t On i.[RecID] =  t.[ParentLink_RecID] 
WHERE i.[Status] <> 'Closed'
AND t.[OwnerTeam] IS NOT NULL
group by i.[RecID]
Order By i.[RecID] DESC

当前结果

AssigneeID              CreatedDateTime 
FFFE53B2305D47388937D1F5B6722DF3    2013-05-13 14:36:55.000
FFD64AD977A449258A88B9A404795631    2013-05-21 14:11:28.000
FFD557F622A34FD1A386B427B66ADAFC    2013-04-26 12:32:05.000

必填结果

AssigneeID                          Owner
FFFE53B2305D47388937D1F5B6722DF3    Bob
FFD64AD977A449258A88B9A404795631    Fred
FFD557F622A34FD1A386B427B66ADAFC    Harry

提前感谢您的任何帮助..

4 个答案:

答案 0 :(得分:0)

您可以将当前查询结果与记录ID列上的任务表(获取所有者列数据)结合起来。 例如:

select t1.AssigneeID, t2.Owner from (your current query) t1, Task t2 where t1.AssigneeID = t2.ParentLink_RecID
order by 1 desc

Full ex:

select t1.[AssigneeID] as AssigneeID, t2.[Owner] as Owner 
from Task t2 
LEFT JOIN (SELECT I. [RecID] as AssigneeID, max(t.[CreatedDateTime]) CreatedDateTime FROM Incident as i Join Task as t On i.[RecID] = t.[ParentLink_RecID] WHERE i.[Status] <> 'Closed' AND t.[OwnerTeam] IS NOT NULL group by i.[RecID]) t1 
on t2.[ParentLink_RecID] = t1.[AssigneeID] 
order by t1.[AssigneeID] desc

答案 1 :(得分:0)

尝试:

SELECT AssignedID, Owner
FROM
( 
 SELECT i.[RecID] as AssigneeID, max(t.[CreatedDateTime]) CreatedDateTime, t.[Owner]
FROM Incident as i
Join Task as t On i.[RecID] =  t.[ParentLink_RecID] 
WHERE i.[Status] <> 'Closed'
AND t.[OwnerTeam] IS NOT NULL
group by i.[RecID]
) S
Order By AssignedID DESC

答案 2 :(得分:0)

您没有说,但基于[columnName]语法,看起来您正在使用MS SQLServer。如果是这样,那么您可以使用RANK()或ROW_NUMBER()来获得有效的解决方案。

with rankedResult as (
  select i.[AssigneeID],
         t.[Owner],
         row_number() over( partition by i.[AssigneeID] 
                            order by t.[CreatedDateTime] desc, t.[Owner] ) seq
    from Incident i
    join Task t
      on t.[ParentLink_RecID] = i.[RecID]
   where i.[Status] <> 'Closed'
     and t.[OwnerTeam] is not null
)
select [AssigneeID],
       [Owner]
  from rankedResult
 where seq=1
;

答案 3 :(得分:0)

试试这个

SELECT x.AssigneeID, tt.Owner
FROM (
   SELECT i.[RecID] as AssigneeID, max(t.[CreatedDateTime]) CreatedDateTime
   FROM Incident as i
   Join Task as t On i.[RecID] =  t.[ParentLink_RecID] 
   WHERE i.[Status] <> 'Closed'
   AND t.[OwnerTeam] IS NOT NULL
   group by i.[RecID]
) x
JOIN Task as TT ON (x.RecID = tt.ParentLine_RecID)
ORDER BY x.AssigneeID DESC