1

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

示例数据

| 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,但答案应该能够在不同的数据库中推广。

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

4

1 回答 1

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().

于 2013-03-22T15:40:28.623 回答