天道酬勤,学无止境

从 MySQL 中选择随机行(有概率)(Select random row from MySQL (with probability))

问题

我有一个 MySQL 表,它有一个名为 cur_odds 的行,它是一个百分比数字,该行被选中的概率百分比。 例如,当您运行 100 个查询时,如何进行查询以实际选择大约该频率的行?

我尝试了以下操作,但概率为 0.35 的行最终在 60-70% 的时间内被选中。

SELECT * FROM table ORDER BY RAND()*cur_odds DESC

表中 cur_odds 的所有值加起来正好是 1。

回答1

如果cur_odds很少更改,则可以实现以下算法:

1) 创建另一列prob_sum ,为此

prob_sum[0] := cur_odds[0]

对于 1 <= i <= row_count - 1:

prob_sum[i] := prob_sum[i - 1] + cur_odds[i]

2) 生成一个从 0 到 1 的随机数:

rnd := rand(0,1)

3) 找到prob_sum > rnd的第一行(如果您在prob_sum上创建 BTREE 索引,则查询应该工作得更快):

创建索引 prob_sum_ind ON <table> (prob_sum);

设置@rnd := 兰德();

SELECT MIN(prob_sum) FROM <table> WHERE prob_sum > @rnd;

回答2

鉴于您的上述 SQL 语句,您在cur_odds中的任何数字都不是选择每一行的概率,而只是一个任意权重(相对于所有其他行的“权重”),而最好将其解释为向排序表顶部浮动的相对趋势。 每行中的实际值是没有意义的(例如,您可以有 4 行的值分别为 0.35、0.5、0.75 和 0.99,或者您的值可以为 35、50、75 和 99,结果将相同)。

更新:这是您查询的情况。 您有一行的cur_odds值为 0.35。 为了说明起见,我将假设其他 9 行都具有相同的值 (0.072)。 同样为了说明起见,让我们假设 RAND() 返回一个从 0.0 到 1.0 的值(它实际上可能)。

每次运行此 SELECT 语句时,通过将其cur_odds值乘以从 0.0 到 1.0 的 RAND() 值,为每一行分配一个排序值。 这意味着具有 0.35 的行将具有介于 0.0 和 0.35 之间的排序值。

每隔一行(值为 0.072)将具有介于 0.0 和 0.072 之间的排序值。 这意味着您的一行的排序值有大约 80% 的可能性大于 0.072,这意味着任何其他行都没有可能排在更高的位置。 这就是为什么您的cur_odds值为 0.35 的行比您预期的更频繁地首先出现。

我错误地将cur_odds值描述为相对变化权重。 它实际上用作最大相对权重,然后将涉及一些复杂的数学运算来确定所涉及的实际相对概率。

我不确定你需要什么可以用直接的 T-SQL 来完成。 我已经多次实现了加权概率选择器(讽刺的是,我什至今天早上要问一个关于最佳方法的问题),但总是在代码中。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • MySQL从60万行中快速选择10条随机行(MySQL select 10 random rows from 600K rows fast)
    问题 如何最好地编写一个查询,从总共60万行中随机选择10行? 回答1 一个出色的职位,处理从简单到有缺口,再到有缺口不均匀的几种情况。 http://jan.kneschke.de/projects/mysql/order-by-rand/ 对于大多数一般情况,这是您的操作方法: SELECT name FROM random AS r1 JOIN (SELECT CEIL(RAND() * (SELECT MAX(id) FROM random)) AS id) AS r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC LIMIT 1 这假定id的分布是相等的,并且id列表中可能存在间隙。 请参阅文章以获取更多高级示例 回答2 SELECT column FROM table ORDER BY RAND() LIMIT 10 不是有效的解决方案,但有效 回答3 具有出色性能并可以弥补空白的简单查询: SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id 在200K表上的此查询需要0.08s ,而在我的计算机上,普通版本(SELECT * FROM tbl ORDER BY RAND()LIMIT 10)需要0
  • 从mysql中的大表中快速选择随机行(quick selection of a random row from a large table in mysql)
    问题 从大型mysql表中选择随机行的快速方法是什么? 我正在使用php,但是我对任何解决方案都感兴趣,即使它是另一种语言也是如此。 回答1 抓住所有ID,从中随机选择一个ID,然后检索整行。 如果您知道ID是连续无孔的,则只需获取最大值并计算一个随机ID。 如果到处都有孔,但大多数是顺序值,并且您不关心随机偏斜,请抓住最大值,计算一个id,然后选择ID等于或大于您所计算的ID的第一行。 偏斜的原因是,跟着另一个id的那些洞,跟随这些洞的id更有可能被选中。 如果您是随机订购的话,那么您手上的桌子扫描将很糟糕,而“快速”一词不适用于这样的解决方案。 不要这样做,也不要按GUID订购,它有相同的问题。 回答2 我知道必须有一种方法可以在单个查询中快速完成该操作。 这里是: 一种无需外部代码参与的快速方法, http://jan.kneschke.de/projects/mysql/order-by-rand/ SELECT name FROM random AS r1 JOIN (SELECT (RAND() * (SELECT MAX(id) FROM random)) AS id) AS r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC LIMIT 1; 回答3 MediaWiki使用了一个有趣的技巧(用于Wikipedia的Special
  • 从mysql中的大表中快速选择随机行(quick selection of a random row from a large table in mysql)
    问题 从大型mysql表中选择随机行的快速方法是什么? 我正在使用php,但是我对任何解决方案都感兴趣,即使它是另一种语言也是如此。 回答1 抓住所有ID,从中随机选择一个ID,然后检索整行。 如果您知道ID是连续无孔的,则只需获取最大值并计算一个随机ID。 如果到处都有孔,但大多数是顺序值,并且您不关心随机偏斜,则获取最大值,计算一个id,然后选择ID等于或大于您所计算的ID的第一行。 偏斜的原因是,跟着另一个id的那些洞,跟随这些洞的id会有更高的机会被选中。 如果您是随机订购的话,那么您手上的桌子扫描将很糟糕,而“快速”一词不适用于这样的解决方案。 不要这样做,也不要按GUID订购,它有相同的问题。 回答2 我知道必须有一种方法可以在单个查询中快速完成该操作。 这里是: 一种无需外部代码参与的快速方法, http://jan.kneschke.de/projects/mysql/order-by-rand/ SELECT name FROM random AS r1 JOIN (SELECT (RAND() * (SELECT MAX(id) FROM random)) AS id) AS r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC LIMIT 1; 回答3 MediaWiki使用了一个有趣的技巧
  • MySQL从两个表中选择带有JOIN的随机行(MySQL select random row with JOIN from two tables)
    问题 几天来,我一直在寻找解决此问题的方法,但找不到任何可以减少运行查询所需时间的方法。 我有2张桌子: "product_db": unique_id - [index] image url_title status - [index] "product_page" id product_unique_id - [index] page_id - [index] 我要选择的是来自 product_db 的随机图像,其中 status = 'Online' 并且产品必须在 page id = 3 中 product_db 有超过 90,000 个产品,product_page 有超过 150000 行。 我现在使用的查询是: SELECT image FROM product_db a, product_page b WHERE b.page_id = 3 AND a.status = 'Online' AND a.unique_id = b.product_unique_id ORDER BY RAND() LIMIT 1 运行此查询大约需要 2.3 秒。 网页加载时间很长。 我尝试了一些其他查询,首先从 product_page 返回一个随机行,page_id = 3,然后查询 product_db(它确实减少了它花费的时间)但问题是我无法比较产品是否“在线” . 回答1
  • mySQL 返回可能重复的随机行(mySQL return random rows with possible duplicates)
    问题 我正在尝试随机化一定数量的行,但假设数据库中只有 4 行,我需要获得 6 个随机行我希望有可能(即使表中有 6 行以上)产生重复行。 这在 mySQL 中容易实现吗? 我目前的查询是这样的: SELECT * FROM winners ORDER BY RAND() LIMIT 6 这个想法是用户可以赢得不止一次。 :) 希望你能帮上忙! ! 回答1 任何涉及ORDER BY RAND()解决方案都不受欢迎,因为它不能使用索引,而且它基本上对整个表(可能会变得非常大)进行排序,只是为了选择一行。 更好的解决方案包括在 MIN(id) 和 MAX(id) 之间生成一个随机数,这是您选择的随机行。 随着您的桌子变大,这将成为越来越大的优势。 选择一个随机 ID 的效率要高得多,我建议一次只选择六个随机 ID,然后一次查找这些行。 因此,您有机会多次选择给定的行。 如果不能保证所有 ID 都是连续的,则可以选择比随机选择大的第一个 ID。 所以在伪代码中: $MIN, $MAX = SELECT MIN(ID), MAX(ID) FROM winners FOR LOOP FROM 1 to 6 $R = $MIN+RANDOM($MAX-$MIN) $WINNER[] = SELECT * FROM winners WHERE id >= $R LIMIT 1 回答2
  • 在MySQL中选择随机行(Selecting Random Rows in MySQL)
    问题 我正在开发一个测验网站,并且我有一个存储所有问题的数据库。 测验有不同类型,例如数学,科学,历史等。所有问题都存储在一个表中。 我的问题表如下所示: questions ( qno(int) ,type(int), question, .... ,... ) qno是主键, type用于跟踪测验类型。 if type = 1 (math) type = 2(science) 现在,我想为每种测试选择一些随机问题。 例如,我可能只想为数学测试选择一些随机的20个问题。 MySQL有某种方式选择随机行吗? 回答1 您可以在MySQL中使用rand函数对行进行排序,然后将limit排在前10位(或您想要的很多)。 select * from table order by rand() limit 10 如果只需要数学问题: select * from table where type = 1 order by rand() limit 10 回答2 在表中添加一列,该列将保留UNIX时间戳。 每天一次或任何适合您的时间范围,您都会运行查询以更新该列。 在这种情况下,您的查询应该在午夜运行,看起来像这样。 UPDATE table SET rand_id = (UNIX_TIMESTAMP() + (RAND() * 86400)); 然后,要检索行,请使用与此类似的查询。
  • 从具有加权行概率的PostgreSQL表中选择随机行(Select random row from a PostgreSQL table with weighted row probabilities)
    问题 输入示例: SELECT * FROM test; id | percent ----+---------- 1 | 50 2 | 35 3 | 15 (3 rows) 您将如何编写这样的查询,即平均50%的时间我可以得到id = 1的行,id = 2的35%的行和id = 3的15%的行? 我尝试了类似SELECT id FROM test ORDER BY p * random() DESC LIMIT 1 ,但结果错误。 经过10,000次运行后,我得到了这样的分布: {1=6293, 2=3302, 3=405} ,但是我期望分布几乎是: {1=6293, 2=3302, 3=405} {1=5000, 2=3500, 3=1500} 。 有任何想法吗? 回答1 这应该可以解决问题: WITH CTE AS ( SELECT random() * (SELECT SUM(percent) FROM YOUR_TABLE) R ) SELECT * FROM ( SELECT id, SUM(percent) OVER (ORDER BY id) S, R FROM YOUR_TABLE CROSS JOIN CTE ) Q WHERE S >= R ORDER BY id LIMIT 1; 子查询Q给出以下结果: 1 50 2 85 3 100 然后
  • MySQL:选择多个随机行的最有效方法是什么(MySQL: what's the most efficient way to select multiple random rows)
    问题 我有一个相当大的数据集和一个需要两个联接的查询,因此查询的效率对我来说非常重要。 我需要根据联接的结果从数据库中检索3个满足条件的随机行。 这里指出最明显的解决方案效率低下,因为 [这些解决方案]需要对所有表进行顺序扫描(因为需要计算与每一行关联的随机值-这样才能确定最小的行),即使对于中等大小的表也可能相当慢。 但是,那里的作者建议的方法( SELECT * FROM table WHERE num_value >= RAND() * (SELECT MAX(num_value) FROM table) LIMIT 1其中num_value是ID)对我不起作用,因为可能缺少某些ID (因为某些行可能已被用户删除)。 那么,在我的情况下,检索3个随机行的最有效方法是什么? 编辑:解决方案不必是纯SQL。 我也使用PHP。 回答1 将您的RAND()调用添加到ORDER BY子句中应使您可以忽略ID。 试试这个: SELECT * FROM table WHERE ... ORDER BY RAND() LIMIT 3; 在指出性能问题之后,最好的选择是遵循以下方针(利用PHP): $result = PDO:query('SELECT MAX(id) FROM table'); $max = $result->fetchColumn(); $ids = array();
  • 如何从数据库中回显随机行?(How to echo random rows from database?)
    问题 我有一个数据库表,其中包含约1.6亿行。 该表有两列: id和listing 。 我只需要使用PHP从listing列中显示1000个随机行,并将它们放入<span>标记中即可。 像这样: <span>Row 1</span> <span>Row 2</span> <span>Row 3</span> 我一直在尝试使用ORDER BY RAND()来做到这一点,但是要花这么长时间才能在如此大的数据库上加载,而且我还找不到其他解决方案。 我希望有一个快速/轻松的方法来做到这一点。 我无法想象仅仅回显1000个随机行是不可能的……谢谢! 回答1 ORDER BY RAND()是一个可以在小型数据库上正常运行的mysql函数,但是如果您运行的行大于10k,则应在程序内部构建函数,而不要使用mysql预制函数或以特殊方式组织数据。 我的建议:通过自动增量id保持mysql数据索引,或添加其他增量和唯一行。 然后构建一个选择函数: <?php //get total number of rows $result = mysql_query('SELECT `id` FROM `table_name`', $link); $num_rows = mysql_num_rows($result); $randomlySelected = []; for( $a = 0; $a < 1000
  • 从Linq到Sql的随机行(Random row from Linq to Sql)
    问题 当我有条件(例如某些字段必须为真)时,使用Linq to SQL检索随机行的最佳(最快)方法是什么? 回答1 您可以通过使用伪造的UDF在数据库上执行此操作; 在部分类中,向数据上下文添加一个方法: partial class MyDataContext { [Function(Name="NEWID", IsComposable=true)] public Guid Random() { // to prove not used by our C# code... throw new NotImplementedException(); } } 然后只需order by ctx.Random() ; 这将根据NEWID()在SQL Server上进行随机排序。 IE var cust = (from row in ctx.Customers where row.IsActive // your filter orderby ctx.Random() select row).FirstOrDefault(); 请注意,这仅适用于中小型表。 对于巨大的表,这将对服务器的性能产生影响,查找行数( Count ),然后随机选择一个行( Skip/First ),效率会更高。 对于计数方法: var qry = from row in ctx.Customers where row
  • 使用 MySQL 选择随机行(Selecting random rows with MySQL)
    问题 我看到了很多关于这个主题的话题,但我一直没有成功理解如何去做。 例如,如果我有这个表: +------+-------+-------+ | id | name | class | +------+-------+-------+ | 5 | test | one | | 10 | test2 | one | | 12 | test5 | one | | 7 | test6 | two | +------+-------+-------+ 我只想显示“一”类中的 X 个随机行,我该怎么做? 注意:这是一张大桌子,所以我不想使用ORDER BY RAND 。 回答1 正如您所知,大多数人推荐的ORDER BY RAND()解决方案不能扩展到大表。 SET @r := (SELECT FLOOR(RAND() * (SELECT COUNT(*) FROM mytable))); SET @sql := CONCAT('SELECT * FROM mytable LIMIT 1 OFFSET ', @r); PREPARE stmt1 FROM @sql; EXECUTE stmt1; 我在《SQL 反模式:避免数据库编程的陷阱》一书中介绍了这个和其他解决方案。 如果你想用 PHP 做到这一点,你可以做这样的事情(未测试): <?php $mysqli->begin
  • 我如何优化MySQL的ORDER BY RAND()函数?(How can i optimize MySQL's ORDER BY RAND() function?)
    问题 我想优化查询,以便查看mysql-slow.log 。 我的大多数慢查询都包含ORDER BY RAND() 。 我找不到解决此问题的真正解决方案。 在MySQLPerformanceBlog上有一个可能的解决方案,但我认为这还不够。 在优化不佳(或经常更新,用户管理)的表上,该表不起作用,或者需要运行两个或多个查询,然后才能选择我的PHP生成的随机行。 这个问题有解决方案吗? 一个虚拟的例子: SELECT accomodation.ac_id, accomodation.ac_status, accomodation.ac_name, accomodation.ac_status, accomodation.ac_images FROM accomodation, accomodation_category WHERE accomodation.ac_status != 'draft' AND accomodation.ac_category = accomodation_category.acat_id AND accomodation_category.acat_slug != 'vendeglatohely' AND ac_images != 'b:0;' ORDER BY RAND() LIMIT 1 回答1 试试这个: SELECT * FROM (
  • 如何在SQL中请求随机行?(How to request a random row in SQL?)
    问题 如何在纯SQL中请求随机行(或尽可能接近真正的随机行)? 回答1 参见这篇文章:SQL从数据库表中选择一个随机行。 它介绍了在MySQL,PostgreSQL,Microsoft SQL Server,IBM DB2和Oracle中执行此操作的方法(以下内容从该链接复制而来): 使用MySQL选择一个随机行: SELECT column FROM table ORDER BY RAND() LIMIT 1 使用PostgreSQL选择一个随机行: SELECT column FROM table ORDER BY RANDOM() LIMIT 1 使用Microsoft SQL Server选择一个随机行: SELECT TOP 1 column FROM table ORDER BY NEWID() 使用IBM DB2选择随机行 SELECT column, RAND() as IDX FROM table ORDER BY IDX FETCH FIRST 1 ROWS ONLY 使用Oracle选择一个随机记录: SELECT column FROM ( SELECT column FROM table ORDER BY dbms_random.value ) WHERE rownum = 1 回答2 杰里米(Jeremies)等解决方案: SELECT * FROM
  • MySQL选择3个随机行,其中三行之和小于值(MySQL Select 3 random rows where sum of three rows is less than value)
    问题 我正在尝试从表中选择三个随机行,其中它们的组合item_price列小于所需的数量。 假设您有一个<input>金额。 输入美元金额时,数据库将返回三个随机项目,它们的组合价格小于或等于您输入的美元金额。 如果我输入$ 300,则可以购买这三个项目,分别为$ 150,$ 100和$ 50。 我在创建查询时将遇到困难,该查询将返回三个符合此条件的项目。 SELECT t1.item_id, t1.item_price FROM items t1 INNER JOIN items t2 ON ( t1.item_id = t2.item_id ) GROUP BY t1.item_id, t1.item_name, t1.item_price HAVING SUM( t2.item_price ) <=300 ORDER BY RAND( ) LIMIT 3 我以为这会起作用,但是我认为那只是巧合。 它似乎只返回价格低于$ 300而不是总价低于$ 300的任何三件商品。 我也尝试过以下查询: SELECT t1.item_id, t1.item_price FROM items t1 JOIN items t2 ON t2.item_id <= t1.item_id WHERE t2.item_price <= 500 GROUP BY t1.item_id HAVING SUM
  • 从sqlite表中选择随机行(Select random row from a sqlite table)
    问题 我有一个具有以下架构的sqlite表: CREATE TABLE foo (bar VARCHAR) 我正在使用此表作为字符串列表的存储。 如何从此表中选择随机行? 回答1 看看从SQLite表中选择随机行 SELECT * FROM table ORDER BY RANDOM() LIMIT 1; 回答2 以下解决方案比anktastic的解决方案要快得多(count(*)花费很多,但是如果您可以对其进行缓存,则差异不应该那么大),其本身比“ order by random()”要快得多。当您有很多行时,尽管它们有一些不便之处。 如果您的行标识符比较紧凑(即删除了很少的内容),那么您可以执行以下操作(使用(select max(rowid) from foo)+1代替max(rowid)+1提供更好的性能,如注释中所述) : select * from foo where rowid = (abs(random()) % (select (select max(rowid) from foo)+1)); 如果有漏洞,有时会尝试选择一个不存在的rowid,并且该选择将返回空结果集。 如果这是不可接受的,则可以提供如下默认值: select * from foo where rowid = (abs(random()) % (select (select max(rowid)
  • Hibernate Criteria API:获取n个随机行(Hibernate Criteria API: get n random rows)
    问题 我不知道如何从条件实例中获取n个随机行: Criteria criteria = session.createCriteria(Table.class); criteria.add(Restrictions.eq('fieldVariable', anyValue)); ... 那怎么了我找不到使用Criteria API的任何文档 这是否意味着我应该改用HQL? 谢谢! 编辑:我通过以下方式获得行数: int max = criteria.setProjecxtion(Projections.rowCount()).uniqueResult(); 如何获取索引介于0和max之间的n个随机行? 再次感谢! 回答1 实际上,使用Criteria进行一些调整是可能的。 方法如下: Criteria criteria = session.createCriteria(Table.class); criteria.add(Restrictions.eq("fieldVariable", anyValue)); criteria.add(Restrictions.sqlRestriction("1=1 order by rand()")); criteria.setMaxResults(5); return criteria.list(); 任何Restrictions
  • MySQL:ORDER BY RAND()的替代方法(MySQL: Alternatives to ORDER BY RAND())
    问题 我已经读到了MySQL的ORDER BY RAND()函数的一些替代方法,但是大多数替代方法仅适用于需要单个随机结果的地方。 有谁知道如何优化返回多个随机结果的查询,例如: SELECT u.id, p.photo FROM users u, profiles p WHERE p.memberid = u.id AND p.photo != '' AND (u.ownership=1 OR u.stamp=1) ORDER BY RAND() LIMIT 18 回答1 更新2016 使用索引列,此解决方案效果最佳。 这是标记有100,000行的优化查询平台的简单示例。 最优化: 300ms SELECT g.* FROM table g JOIN (SELECT id FROM table WHERE RAND() < (SELECT ((4 / COUNT(*)) * 10) FROM table) ORDER BY RAND() LIMIT 4) AS z ON z.id= g.id 有关限制金额的说明:限制4和4 / count(*)。 4位数必须相同。 更改退货数量不会对速度产生太大影响。 极限4和极限1000的基准相同。 极限10,000耗时长达600毫秒 关于join的注意事项:仅对id进行随机化要比对整行进行随机化要快。 由于必须将整行复制到内存中
  • 在Python中从巨大的CSV文件中读取随机行(Read random lines from huge CSV file in Python)
    问题 我有一个很大的CSV文件(15 Gb),我需要从中读取大约一百万行。 据我所见-并实现-Python中的CSV实用程序仅允许按顺序在文件中进行迭代。 将所有文件读入内存以使用一些随机选择是非常消耗内存的,要遍历所有文件并丢弃一些值并选择其他值是非常耗时的,因此,无论如何要从CSV文件中选择一些随机行并只读那条线? 我尝试没有成功: import csv with open('linear_e_LAN2A_F_0_435keV.csv') as file: reader = csv.reader(file) print reader[someRandomInteger] CSV文件的示例: 331.093,329.735 251.188,249.994 374.468,373.782 295.643,295.159 83.9058,0 380.709,116.221 352.238,351.891 183.809,182.615 257.277,201.302 61.4598,40.7106 回答1 import random filesize = 1500 #size of the really big file offset = random.randrange(filesize) f = open('really_big_file') f.seek(offset) #go
  • 每个指定的组选择n个随机行(select n random rows per specified group)
    问题 我正在努力寻找以下问题的最佳解决方案。 假设我有一个像这样的表“ Table”: id name report_id 1 name1 1 2 name2 3 3 name3 5 4 name1 7 5 name3 8 .................... 我想为集合中的每个值选择:('name1','name2')10个随机唯一行。 当然,可以像这样进行联合: (SELECT * FROM Table WHERE name='name1' ORDER BY RAND() LIMIT 10) UNION (SELECT * FROM Table WHERE name='name2' ORDER BY RAND() LIMIT 10) 但是,如果我有100个唯一的名称,而我必须为其选择10个随机记录,则此查询将有点大。 提前非常感谢 回答1 SQLFiddle演示 select ID,NAME,REPORT_ID from ( select *, @row:=if(name=@name,@row,0)+1 as rn, @name:=name from (select *,RAND() as trand from t) t1, (select @row:=0,@name:='') tm2 order by name,trand ) t2 where rn<=10 回答2
  • 为每个组选择随机行(Select random row for each group)
    问题 我有这样的桌子 ID ATTRIBUTE 1 A 1 A 1 B 1 C 2 B 2 C 2 C 3 A 3 B 3 C 我只想为每个ID选择一个随机属性。 因此,结果可能看起来像这样(尽管这只是许多选项之一 ATTRIBUTE B C C 这是我对这个问题的尝试 SELECT "ATTRIBUTE" FROM ( SELECT "ID", "ATTRIBUTE", row_number() OVER (PARTITION BY "ID" ORDER BY random()) rownum FROM table ) shuffled WHERE rownum = 1 但是,我不知道这是否是一个好的解决方案,因为我需要引入行号,这有点麻烦。 你有更好的吗? 回答1 select distinct on (id) id, attribute from like_this order by id, random() 如果只需要属性列: select distinct on (id) attribute from like_this order by id, random() 请注意,您仍然需要id进行排序,因为它是上distinct on一列。 如果只需要不同的属性: select distinct attribute from ( select distinct on (id)