Postgresql Postgres:不同但仅适用于一列
我在pgsql上有一个名为(超过1百万行)的表,但也有许多重复项。我选择了3个字段: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”]。“名称”字段是最重要的字段,每次我进行选择
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 yesname
。查看手册中的distinct on
。我希望TSQL团队能够提供这样一种明智的方法。请使用distinct on子句添加适当的postgresql注释,您只能按相同的内容+更多订购。所以,如果你说(名字)不同,你必须按名字排序,然后再按你想要的任何东西排序。不太理想。Kevin,你可以在FROM中使用CTE或子查询,在外部查询中使用ORDER BY,然后观察性能如何。。。将搜索索引空间中所有可能的结果。因为posgres无法处理不同的distinct/order by,所以它将可能是一个10-20ms、索引正确的查询转换为900ms查询。不管外部查询顺序是什么,它都将使用内部子查询中的索引首先查找匹配项,然后重新排序。很高兴为我们的问题的真正解决方案支付咨询费