Postgres:不同但只有一列
我有一个与名称(有超过1 mio。行)的pgsql表,但我也有很多重复。 我select3个字段: id
, name
, metadata
。
我想用ORDER BY RANDOM()
和LIMIT 1000
来随机select它们,所以我这样做是在我的PHP脚本中保存一些内存的很多步骤。
但是我怎么能这么做呢,只给了我一个没有名字重复的名单。
例如[1,"Michael Fox","2003-03-03,34,M,4545"]
将被退回,但不是[2,"Michael Fox","1989-02-23,M,5633"]
。 名称字段是最重要的,并且每次执行select时都必须在列表中唯一,并且必须是随机的。
我尝试使用GROUP BY name
,然后它期望我有GROUP BY
以及在一个aggragate函数中的id和元数据,但我不想让他们以某种方式过滤。
任何人都知道如何获取许多列,但只做一个独特的列?
要在一个(或多个)列上进行区分:
select distinct on (name) name, col1, col2 from names
这将返回任何包含名称的行。 如果你想控制哪一行将被返回,你需要命令:
select distinct on (name) name, col1, col2 from names order by name, col1
按col1sorting时将返回第一行。
任何人都知道如何获取许多列,但只做一个独特的列?
你想要DISTINCT ON
子句 。
您没有提供样本数据或完整的查询,所以我没有任何东西可以显示给您。 你想写的东西,如:
SELECT DISTINCT ON (name) fields, id, name, metadata FROM the_table;
这将返回一个不可预知(但不是“随机”)的行集。 如果您想使其可预测,请按照Clodaldo的答案添加ORDER BY
。 如果你想使它成为真正的随机,你需要ORDER BY random()
。
SELECT NAME,MAX(ID) as ID,MAX(METADATA) as METADATA from SOMETABLE GROUP BY NAME