[英]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 BY
和DISTINCT
尝试了几种变体,但没有任何成功。
--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.