为每个组选择随机行

spe*_*ndo 7 sql random postgresql 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
Run Code Online (Sandbox Code Playgroud)

我想为每个ID 选择一个随机属性.结果因此看起来像这样(虽然这只是众多选择之一

ATTRIBUTE
B
C
C
Run Code Online (Sandbox Code Playgroud)

这是我对这个问题的尝试

SELECT
  "ATTRIBUTE"
FROM
  (
  SELECT
    "ID",
    "ATTRIBUTE",
    row_number() OVER (PARTITION BY "ID" ORDER BY random()) rownum
  FROM
    table
  ) shuffled
WHERE
  rownum = 1
Run Code Online (Sandbox Code Playgroud)

但是,我不知道这是否是一个很好的解决方案,因为我需要引入行号,这有点麻烦.

你有更好的吗?

Clo*_*eto 15

select distinct on (id) id, attribute
from like_this
order by id, random()
Run Code Online (Sandbox Code Playgroud)

如果您只需要属性列:

select distinct on (id) attribute
from like_this
order by id, random()
Run Code Online (Sandbox Code Playgroud)

请注意,您仍然需要先订购,id因为它是一列distinct on.

如果您只想要不同的属性:

select distinct attribute
from (
    select distinct on (id) attribute
    from like_this
    order by id, random()
) s
Run Code Online (Sandbox Code Playgroud)