[英]Select random row for each group
I have a table like this 我有一张这样的桌子
ID ATTRIBUTE
1 A
1 A
1 B
1 C
2 B
2 C
2 C
3 A
3 B
3 C
I'd like to select just one random attribute for each ID. 我想为每个ID选择一个随机属性。 The result therefore could look like this (although this is just one of many options
结果因此看起来像这样(虽然这只是众多选择之一
ATTRIBUTE
B
C
C
This is my attempt on this problem 这是我对这个问题的尝试
SELECT
"ATTRIBUTE"
FROM
(
SELECT
"ID",
"ATTRIBUTE",
row_number() OVER (PARTITION BY "ID" ORDER BY random()) rownum
FROM
table
) shuffled
WHERE
rownum = 1
however, I don't know if this is a good solution, as I need to introduce row numbers, which is a bit cumbersome. 但是,我不知道这是否是一个很好的解决方案,因为我需要引入行号,这有点麻烦。
Do you have a better one? 你有更好的吗?
select distinct on (id) id, attribute
from like_this
order by id, random()
If you only need the attribute column: 如果您只需要属性列:
select distinct on (id) attribute
from like_this
order by id, random()
Notice that you still need to order by id
first as it is a column of the distinct on
. 请注意,您仍然需要首先按
id
排序,因为它是distinct on
的列。
If you only want the distinct attributes: 如果您只想要不同的属性:
select distinct attribute
from (
select distinct on (id) attribute
from like_this
order by id, random()
) s
Put a big random number in front of each record (id) and choose within each group the record with the lowest random number. 在每个记录(id)前面放一个大的随机数,并在每个组中选择具有最低随机数的记录。
$ cat test.txt
\N 1 a
\N 2 b
\N 2 c
\N 2 d
\N 3 e
\N 4 f
$ mysql
USE test;
DROP TABLE test;
CREATE TABLE test (id0 INT NOT NULL AUTO_INCREMENT, id VARCHAR(1), attribute VARCHAR(1), PRIMARY KEY (id0));
LOAD DATA LOCAL INFILE '~/mysql/test.txt' INTO TABLE test FIELDS TERMINATED BY '\t';
DROP TABLE rtest;
CREATE TABLE rtest (random INT(8), id0 VARCHAR(1), id VARCHAR(1), attribute VARCHAR(1), PRIMARY KEY (id, random));
INSERT INTO rtest
SELECT CAST(1000000. * rand() AS INT) AS random, test.* FROM test;
SELECT rtest.* FROM rtest,
(SELECT id, min(random) AS random FROM rtest GROUP BY id) AS sample WHERE rtest.random=sample.random AND rtest.id=sample.id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.