Postgres:区别但仅限于一列

Nov*_*der 109 postgresql select distinct

我有一个关于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和元数据,但我不想让它们以某种方式过滤.

任何人都知道如何获取许多列,但只在一列上做一个不同的?

Clo*_*eto 203

仅对一个(或n)列执行不同的操作:

select distinct on (name)
    name, col1, col2
from names
Run Code Online (Sandbox Code Playgroud)

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

select distinct on (name)
    name, col1, col2
from names
order by name, col1
Run Code Online (Sandbox Code Playgroud)

按col1排序时将返回第一行.

distinct on:

SELECT DISTINCT ON(expression [,...])仅保留给定表达式求值的每组行的第一行.使用与ORDER BY相同的规则解释DISTINCT ON表达式(参见上文).请注意,除非使用ORDER BY确保首先显示所需的行,否则每个集合的"第一行"都是不可预测的.

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


Cra*_*ger 16

任何人都知道如何获取许多列,但只在一列上做一个不同的?

你想要这个DISTINCT ON条款.

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

SELECT DISTINCT ON (name) fields, id, name, metadata FROM the_table;
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,使用此 DISTINCT ON 子句,您只能 ORDER BY 相同的事物 + 更多。因此,如果您说 DISTINCT ON(名称),则必须按名称排序,然后再按您想要的其他方式排序。不太理想。 (2认同)

Sun*_*mar 8

对 n 列执行不同操作:

select distinct on (col1, col2) col1, col2, col3, col4 from names
Run Code Online (Sandbox Code Playgroud)