Postgres:区别但仅限于一列

时间:2013-06-04 09:14:55

标签: postgresql select distinct

我在pgsql上有一个带有名称的表(超过1 mio。行),但我也有很多重复项。我选择了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"]。名称字段是最重要的,每次进行选择时都必须在列表中唯一,并且必须是随机的。

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

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

4 个答案:

答案 0 :(得分:171)

仅对一个(或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 [,...])仅保留给定表达式求值的每组行的第一行。使用与ORDER BY相同的规则解释DISTINCT ON表达式(参见上文)。请注意,除非使用ORDER BY确保首先显示所需的行,否则每个集合的“第一行”都是不可预测的。

     

DISTINCT ON表达式必须与最左边的ORDER BY表达式匹配。 ORDER BY子句通常包含其他表达式,用于确定每个DISTINCT ON组中行的所需优先级。

答案 1 :(得分:12)

  

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

你想要the DISTINCT ON clause

您没有提供示例数据或完整查询,因此我没有任何内容可以向您展示。你想写类似的东西:

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

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

答案 2 :(得分:3)

SELECT NAME,MAX(ID) as ID,MAX(METADATA) as METADATA 
from SOMETABLE
GROUP BY NAME

答案 3 :(得分:0)

要在n列上执行不同操作:

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