2013-07-04 93 views
1

如下表内:的Sql多选择一个行子组从同一个表

id | group_s | name 
_____________________ 
1 | 1 | pollo 
2 | 1 | cordero 
3 | 1 | cerdo 
4 | 2 | tomates 
5 | 2 | naranjas 
6 | 2 | manzanas 

我想随机地选择从每一个组中的一个线。可能的输出的实施例 (因为它是随机的):

id | group_s | name 
_____________________ 
3 | 1 | cerdo 
5 | 2 | naranjas 

id | group_s | name 
_____________________ 
1 | 1 | pollo 
6 | 2 | manzanas 

等..

我没有线索如何做到这一点。我想我应该多选表格。 我曾尝试没有成功如下:

SELECT T2.* FROM (
SELECT group_s 
FROM mytable 
GROUP BY group_s ORDER BY RAND() LIMIT 1) AS T1 
JOIN mytable AS T2 
ON T1.group_s = T2.group_s; 

回答

1

使用窗函数ROW_NUMBER() OVER(PARTITION BY group_s)ORDER BY NEWID()随机获得订货,这样的事情:

WITH CTE 
AS 
(
    SELECT *, 
    ROW_NUMBER() OVER(PARTITION BY group_s 
         ORDER BY newid()) AS RN 
    FROM yourTable 
) 
SELECT id , group_s , name 
FROM CTE 
WHERE RN = 1; 

看到它在这里的行动:

+0

感谢您的帮助。我试图让你的语句在我的服务器下工作,但它不(我是在创建相应的表后复制粘贴语句)。它显示了一个错误1064-错误的sql语法。并且我在SQL Fiddle Demo下正在运行。这可能是一个MySQL版本的问题? –

+0

@ user903645 - 我很抱歉,我认为它是SQL Server,对于MySQL我尝试了它,但是我可以,我做到了,但是每次对于'Id'的最小值不是随机的,请参阅[this sql fiddle demo ](http://www.sqlfiddle.com/#!2/be046/16)。我用MySQL标签重申了你的问题,并等待另一个答案。你也可以不接受这个答案,因为它不是正确的答案。你也可以谷歌***分区通过*** *** mysql row_number,你会发现很多文章解释如何做到这一点。 –