159

我在 pgsql 上有一个带有名称的表(有超过 1 个 mio. 行),但我也有很多重复项。我选择 3 个字段:id, name, metadata.

我想用ORDER BY RANDOM()and随机选择它们LIMIT 1000,所以我这样做是为了在我的 PHP 脚本中节省一些内存。

但是我怎么能这样做,所以它只会给我一个名称没有重复的列表。

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

我尝试使用GROUP BY name, bu 然后它希望我在 id 和元数据中GROUP BY或在聚合函数中,但我不想以某种方式过滤它们。

任何人都知道如何获取许多列但只在一列上执行不同的操作?

4

4 回答 4

293

仅对一个(或 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

SELECT DISTINCT ON ( expression [, ...] ) 只保留给定表达式计算结果为相等的每组行的第一行。DISTINCT ON 表达式使用与 ORDER BY 相同的规则进行解释(见上文)。请注意,除非使用 ORDER BY 来确保所需的行首先出现,否则每组的“第一行”是不可预测的。

DISTINCT ON 表达式必须匹配最左边的 ORDER BY 表达式。ORDER BY 子句通常包含附加表达式,这些表达式确定每个 DISTINCT ON 组中行的所需优先级。

于 2013-06-04T12:36:01.350 回答
21

任何人都知道如何获取许多列但只在一列上执行不同的操作?

你想要子句DISTINCT ON

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

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

这将返回一组不可预测的(但不是“随机的”)行。如果您想让它可预测,请添加ORDER BY每个 Clodaldo 的答案。如果你想让它真正随机,你会想要ORDER BY random().

于 2013-06-04T12:35:13.433 回答
5

要对 n 列执行不同的操作:

select distinct on (col1, col2) col1, col2, col3, col4 from names
于 2020-11-30T13:47:04.363 回答
2
SELECT NAME,MAX(ID) as ID,MAX(METADATA) as METADATA 
from SOMETABLE
GROUP BY NAME
于 2013-06-04T09:17:35.063 回答