2013-03-19 27 views
1

我一直在这一天拉我的头发,任何人都可以帮助我。我认为这可能很简单,但我不能完全得到我想要的。Sql Group按列中的最大值

该表中的数据看起来像这样

CallId  ProblemDescription CurrentAction  CurrentEngineer EventNumber 
CON-00002      Respond to Call      0 
WHS-00001      Respond to Call      0 
WHS-00002      Respond to Call      0 
WHS-00003      Respond to Call      0 
WHS-00003      Fix Problem       1 
WHS-00003      Problem Fixed      2 

我想这样做是为了显示所有列的foreach呼叫ID的最大事件数。即

CallId  ProblemDescription CurrentAction  CurrentEngineer EventNumber 
CON-00002      Respond to Call      0 
WHS-00001      Respond to Call      0 
WHS-00002      Respond to Call      0 
WHS-00003      Problem Fixed      2 

但是我不知道该怎么做。

目前我使用

Select CallId, MAX(ProblemDescription), MAX(CurrentAction), MAX(CurrentEngineer), 
MAX(EventNumber) FROM [Table] GROUP BY CallId 

如何这显然返回最大为每coloumn独立。所以在CurrentAction列上面的情况下显示Respond to CallRespond to Call

任何人都可以告诉我如何做到这一点???

感谢

回答

3

我假定你正在寻找DENSE_RANK

WITH CTE AS 
(
    SELECT 
     CallId, 
     ProblemDescription, 
     CurrentAction, 
     CurrentEngineer, 
     EventNumber, 
     Rank = DENSE_RANK() OVER (PARTITION BY CallId ORDER BY EventNumber DESC) 
    FROM dbo.TableName 
) 
SELECT 
    CallId, ProblemDescription, CurrentAction, CurrentEngineer, EventNumber 
FROM 
    CTE 
WHERE 
    RANK = 1 

如果你想每CallId只有一排连如果有多个使用相同的最大,则使用ROW_NUMBER代替。

+0

我真的很喜欢在SQL学习新的东西:d – 2013-03-19 16:25:59

+1

碰巧的,(我应该包括这在我的问题),对表的主键是一个组合Call_Id和EventNumber,所以这是实现它的最好方法。然而@Gordon Linoff给出的另一种方法也很棒。 – 2013-03-22 09:25:14

1

你想用这个ROW_NUMBER():

select CallId, ProblemDescription, CurrentAction, CurrentEngineer, EventNumber 
from (select t.*, 
      ROW_NUMBER() over (partition by callId order by eventnumber desc) as seqnum 
     from t 
    ) t 
where seqnum = 1 
0

使用此代码。 *仅在事件编号列上使用最大聚合。

SELECT CallID, Problem_Description, Current_Action, Current_Engineer, MAX(Event_Number) FROM test.data GROUP BY CallID; 

这可以帮助你