2015-05-04 50 views
1

我有成千上万的群体在一个表中,是这样的:选择前100组

1.. 
1.. 
2.. 
2.. 
2.. 
2.. 
3.. 
3.. 
. 
. 
. 
10000.. 
10000.. 

我怎样才能使一个选择给我的前3组各一次。

我想要的东西像从行中选择Top 3,但它必须返回前三组而不是前三行。

+0

你有相同的记录或不同的记录? –

+0

我不确定你的意思,你可以扩展一下你想做的事情吗? – HoneyBadger

+0

你只想要组ID还是一些汇总数据?按哪个顺序? – 1010

回答

3

你可以试试这个:

;with cte as (

select distinct groupId from mytable order by groupid 
) 
select * from mytable where TheGroupId in (select top 3 groupdid from cte) 
1

您可以使用DENSE_RANK为每个组分配一个数字。同一组的所有成员将具有相同的编号。然后在外部查询,选择顶部3组:

SELECT * 
FROM (SELECT *, DENSE_RANK() OVER (ORDER BY id) AS rnk 
     FROM mytable) t 
WHERE t.rnk <= 3 

上述查询假定id是用于组的列记录在一起。

SQL Fiddle Demo

0

有一个SQL TOP声明,做是做什么的这个

SELECT TOP number|percent column_name(s) FROM table_name; 

的描述,它是如何在替代使用例如用于mysql和ms访问的sql语句可以在这里找到:http://www.w3schools.com/sql/sql_top.asp

我的错误我误解了你的问题,这将返回顶部的行而不是组,你能解释你正在试图做更详细的?

+0

嘿,你知道吗,你在评论中提问而不是在答案中。您应该编辑或删除您的答案。 – Stephan

0
SELECT * 
FROM 
    (SELECT * 
      ,ROW_NUMBER() OVER (PARTITION BY [Group] ORDER BY [Group] ASC)rn 
    FROM TableName 
    )A 
WHERE rn <= 3 
1

使用排序功能Row_Number()

SELECT * 
FROM (SELECT *, 
       Row_number() 
       OVER(
        partition BY GroupId 
        ORDER BY GroupId) AS [rn] 
     FROM YourTable) t 
WHERE rn <= 3 

检查这个MSDN doc为所有排名功能的细节。