邮差: 不同的,但只有一栏

我在 pgsql 上有一个名称超过1mio 的表。行) ,但我也有许多重复的。我选择3个字段: idnamemetadata

我想用 ORDER BY RANDOM()LIMIT 1000随机选择它们,所以我需要执行许多步骤来节省 PHP 脚本中的一些内存。

但是我怎么才能做到这一点,所以它只给我一个名单,没有重复的名字。

例如,将返回 [1,"Michael Fox","2003-03-03,34,M,4545"],但不返回 [2,"Michael Fox","1989-02-23,M,5633"]。Name 字段是最重要的,并且每次选择时必须在列表中是唯一的,而且必须是随机的。

我试过使用 GROUP BY name,但它希望我在 GROUP BY中也包含 id 和元数据,或者在聚合函数中包含元数据,但是我不希望以某种方式对它们进行过滤。

有人知道如何获取多个列,但只在一个列上执行不同的操作吗?

137443 次浏览
SELECT NAME,MAX(ID) as ID,MAX(METADATA) as METADATA
from SOMETABLE
GROUP BY NAME

有人知道如何获取多个列,但只在一个列上执行不同的操作吗?

你想要 DISTINCT ON条款

你没有提供样本数据或完整的查询,所以我没有任何东西给你看。你可以这样写:

SELECT DISTINCT ON (name) fields, id, name, metadata FROM the_table;

这将返回一组不可预测(但不是“随机”)的行。如果你想让它可预测性增加一个 ORDER BY每克罗达尔多的答案。如果你想让它真正随机,你会想 ORDER BY random()

只在一列(或 n 列)上做不同的:

select distinct on (name)
name, col1, col2
from names

这将返回包含该名称的任何行。如果你想控制哪些行将被返回,你需要订购:

select distinct on (name)
name, col1, col2
from names
order by name, col1

将在 col1排序时返回第一行。

distinct on :

SELECTDISTINCTON (expression [ ,... ])只保留给定表达式计算结果相等的每组行的第一行。DISTINCTON 表达式使用与 ORDERBY 相同的规则进行解释(参见上文)。请注意,每个集合的“第一行”是不可预测的,除非使用 ORDERBY 确保所需的行首先出现。

DISTINCTON 表达式必须与最左边的 ORDERBY 表达式匹配。ORDERBY 子句通常包含额外的表达式,用于确定每个 DISTINCTON 组中所需的行优先级。

在 n 列上做一个独特的:

select distinct on (col1, col2) col1, col2, col3, col4 from names