使用sql为每个类别选择1个随机记录

时间:2013-03-22 15:38:22

标签: sql postgresql

我有一个方便地称为mytable的大表,有三列:idcat_groupcat_other。我想使用SQL从每个cat_group中选择一个随机元素。我该怎么办?

示例数据

| id | cat_group | cat_other |
+----+-----------+-----------+
|  1 | red       | fred      |
|  2 | blue      | sarah     |
|  3 | blue      | peter     |
|  4 | green     | spot      |
|  5 | red       | peter     |

可接受的结果

| cat_group | id | cat_other |
+-----------+----+-----------+
| red       |  5 | peter     |
| blue      |  2 | sarah     |
| green     |  4 | spot      |

也很好

| cat_group | id | cat_other |
+-----------+----+-----------+
| red       |  1 | fred      |
| blue      |  3 | peter     |
| green     |  4 | spot      |

我在SO上看到了一些类似的问题,但我在实现细节上迷失了方向。我正在使用postgresql,但答案应该可以在不同的数据库中进行推广。

http://sqlfiddle.com/#!1/b42c8/2

的Sqlfiddle

1 个答案:

答案 0 :(得分:4)

以下是一种使用row_number()的方法:

select cat_group, id, cat_other
from (select mytable.*,
             row_number() over (partition by cat_group order by random()) as seqnum
      from mytable
     ) as t
where seqnum = 1

同样的想法适用于其他数据库。但是,随机数函数可能不同。例如,在SQL Server中,rand()每个查询只返回一个值 - 而不是每行。你会使用newid()