SQL SELECT TOP N每个ID,每个时间,每组

时间:2011-07-08 09:31:57

标签: sql-server-2008

我真的很难编写存储过程。 情况就是这样。

我正在连接存储过程中的几个表并将其存储在临时表中。 下面是存储过程给出的结果的说明:

CLIENT        Request     Month   Total

Client A      A           1       1
Client A      B           1       3
Client A      C           1       9
Client A      D           1       4 
Client A      E           1       6

Client A      A           2       6
Client A      B           2       9
Client A      C           2       1
Client A      D           2       3 
Client A      E           2       2

Client B      A           1       3
Client B      B           1       7
Client B      C           1       9
Client B      D           1       8 
Client B      E           1       4

Client B      A           2       5
Client B      B           2       8
Client B      C           2       1
Client B      D           2       1 
Client B      E           2       3

我的问题是,如何根据最高总请求,为每个客户每月获得TOP N(例如:前三名)。

我将在Reporting Service中使用存储的procudere图表,我也很难在图表中使用过滤功能,所以我认为有可能在第一时间过滤它sql查询。

我希望我和上面的插图清楚地解释了这个问题。我非常感谢你的每一个回复。

之前非常感谢

3 个答案:

答案 0 :(得分:3)

DECLARE @TABLE Table
(
    CLIENT varchar(100),Request varchar(10),[Month] int,Total int
)

Insert into @Table

Select 'Client A','A',1,1 UNION ALL
Select 'Client A','B',1,3 UNION ALL
Select 'Client A','C',1,9 UNION ALL
Select 'Client A','D',1,4 UNION ALL
Select 'Client A','E',1,6 UNION ALL
Select 'Client A','A',2,6 UNION ALL
Select 'Client A','B',2,9 UNION ALL
Select 'Client A','C',2,1 UNION ALL
Select 'Client A','D',2,3 UNION ALL
Select 'Client A','E',2,2 UNION ALL
Select 'Client B','A',1,3 UNION ALL
Select 'Client B','B',1,7 UNION ALL
Select 'Client B','C',1,9 UNION ALL
Select 'Client B','D',1,8 UNION ALL
Select 'Client B','E',1,4 UNION ALL
Select 'Client B','A',2,5 UNION ALL
Select 'Client B','B',2,8 UNION ALL
Select 'Client B','C',2,1 UNION ALL
Select 'Client B','D',2,1 UNION ALL
Select 'Client B','E',2,3

Declare @Top int
Set @Top=2

;with CTE AS
(
    SELECT CLIENT,Request,[Month],Total,
    --month wise top record based on total request 
    ROW_NUMBER()Over(Partition by CLIENT,[Month] Order by  Total Desc) AS RN
    FROM @Table
)
Select *
From CTE
where rn<=@Top
Order by CLIENT

答案 1 :(得分:0)

利用GROUPBY子句查找每个客户端的计数,然后使用HAVING过滤掉已创建的GROUP BY的数据。

答案 2 :(得分:0)

row_number分区客户端一起使用,依次使用TOTAL DESC