Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为每个组选择随机行_Sql_Postgresql_Random_Group By_Window Functions - Fatal编程技术网

Sql 为每个组选择随机行

Sql 为每个组选择随机行,sql,postgresql,random,group-by,window-functions,Sql,Postgresql,Random,Group By,Window Functions,我有一张这样的桌子 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",

我有一张这样的桌子

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
然而,我不知道这是否是一个好的解决方案,因为我需要引入行号,这有点麻烦

有更好的吗

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
排序,因为它是
的一列,在
上是不同的

如果只需要不同的属性:

select distinct attribute
from (
    select distinct on (id) attribute
    from like_this
    order by id, random()
) s

在每个记录(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;

但这将以随机顺序返回每个属性,而不是每个ID返回一个属性,或者我误解了您的代码吗?@speendo The
distinct on(ID)
使其在每个IDL上只返回一行,如下所示:mysql中没有类似这样的语法吗?:)