我在pgsql上有一个带有名称的表(超过1 mio。行),但我也有很多重复项。我选择了3个字段:id
,name
,metadata
。
我想用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和元数据,但我不想让它们以某种方式过滤。
任何人都知道如何获取许多列,但只在一列上执行不同的操作?
答案 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排序时将返回第一行。
SELECT DISTINCT ON(expression [,...])仅保留给定表达式求值的每组行的第一行。使用与ORDER BY相同的规则解释DISTINCT ON表达式(参见上文)。请注意,除非使用ORDER BY确保首先显示所需的行,否则每个集合的“第一行”都是不可预测的。
DISTINCT ON表达式必须与最左边的ORDER BY表达式匹配。 ORDER BY子句通常包含其他表达式,用于确定每个DISTINCT ON组中行的所需优先级。
答案 1 :(得分:12)
任何人都知道如何获取许多列,但只在一列上执行不同的操作?
您没有提供示例数据或完整查询,因此我没有任何内容可以向您展示。你想写类似的东西:
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