繁体   English   中英

如何为具有非唯一值的 MySQL 数据集中的每个部分返回随机行

[英]How can I return a random row for each section in a MySQL data set that has non-unique values

给定数据集

+-----------+---------+
| device_id | section |
+-----------+---------+
| 100       | A       |
+-----------+---------+
| 101       | B       |
+-----------+---------+
| 102       | B       |
+-----------+---------+
| 103       | C       |
+-----------+---------+
| 104       | D       |
+-----------+---------+
| 105       | C       |
+-----------+---------+
| 106       | A       |
+-----------+---------+
| 107       | C       |
+-----------+---------+

MySQL 查询将为每个部分生成一个(并且只有一个)行,随机选择。

预期结果(随机变化):

+-----------+---------+
| device_id | section |
+-----------+---------+
| 106       | A       |
+-----------+---------+
| 101       | B       |
+-----------+---------+
| 105       | C       |
+-----------+---------+
| 104       | D       |
+-----------+---------+

我使用GROUP BYDISTINCT尝试了几种变体,但没有任何成功。

--edit-- 我更新了标题以澄清我不是要求返回单行,而是我得到一个,并且每个不同部分只有一个device_id

使用group_concat()以随机顺序创建每个section的所有device_id的逗号分隔列表,并使用substring_index()选择第一个:

select substring_index(group_concat(device_id order by rand()), ',', 1) device_id,
       section
from tablename
group by section

请参阅演示

对于 MySql 8.0+,您可以使用ROW_NUMBER() window function:

select device_id, section
from (
  select *, row_number() over (partition by section order by rand()) rn
  from tablename
) t
where rn = 1

请参阅演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM