Postgresql Postgres:不同但仅适用于一列

Postgresql Postgres:不同但仅适用于一列,postgresql,select,distinct,Postgresql,Select,Distinct,我在pgsql上有一个名为(超过1百万行)的表,但也有许多重复项。我选择了3个字段:id,name,元数据 我想用orderbyrandom()和limit1000随机选择它们,所以我要做的是在PHP脚本中节省一些内存 但我如何才能做到这一点,使它只给我一个名单没有重复的名字 例如,将返回[1,“Michael Fox”,“2003-03-03,34,M,4545”],但不会返回[2,“Michael Fox”,“1989-02-23,M,5633”]。“名称”字段是最重要的字段,每次我进行选择

我在pgsql上有一个名为(超过1百万行)的表,但也有许多重复项。我选择了3个字段:
id
name
元数据

我想用
orderbyrandom()
limit1000
随机选择它们,所以我要做的是在PHP脚本中节省一些内存

但我如何才能做到这一点,使它只给我一个名单没有重复的名字

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

我尝试了
按名称分组
,但它希望我在
按名称分组
中或在加积函数中也有id和元数据,但我不希望以某种方式对它们进行过滤

有人知道如何获取多个列,但只对一个列执行一个不同的操作吗

SELECT NAME,MAX(ID) as ID,MAX(METADATA) as METADATA 
from SOMETABLE
GROUP BY NAME
有人知道如何获取多个列,但只对一个列执行一个不同的操作吗

SELECT NAME,MAX(ID) as ID,MAX(METADATA) as METADATA 
from SOMETABLE
GROUP BY NAME
你想要的

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

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

这将返回一组不可预测(但不是“随机”)的行。如果您想让它变得可预测,请根据Clodaldo的回答添加一个
ORDER BY
。如果要使其真正随机,您需要
orderbyrandom()

只对一列(或n列)执行一次distinct操作:

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

select distinct on (name)
    name, col1, col2
from names
order by name, col1
按col1排序时将返回第一行

:

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

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


要在n列上执行不同的操作,请执行以下操作:

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

请注意:这可能不会返回属于“一起”的ID值或元数据值@Novum No。这意味着它会从Michael的一行中获取ID值,并从另一行中获取元数据,因为它被要求获取Michael的最大值。是的,这在很大程度上取决于实际使用的数据,而我对此一无所知。您可能需要使用MIN或其他什么。刚才演示了如何在
GROUP BY
子句中包含未包含的字段。这不是一个好的解决方案,因为不同行的不同值会混淆。很好地理解了排序。我没有包括它,因为他们提到需要随机排序,但无论如何,重要的是要提到。是否需要按名称排序?它是否会使用col1产生不同的结果?@elliot yes
name
。查看手册中的
distinct on
。我希望TSQL团队能够提供这样一种明智的方法。请使用distinct on子句添加适当的postgresql注释,您只能按相同的内容+更多订购。所以,如果你说(名字)不同,你必须按名字排序,然后再按你想要的任何东西排序。不太理想。Kevin,你可以在FROM中使用CTE或子查询,在外部查询中使用ORDER BY,然后观察性能如何。。。将搜索索引空间中所有可能的结果。因为posgres无法处理不同的distinct/order by,所以它将可能是一个10-20ms、索引正确的查询转换为900ms查询。不管外部查询顺序是什么,它都将使用内部子查询中的索引首先查找匹配项,然后重新排序。很高兴为我们的问题的真正解决方案支付咨询费