Sql 从组中获取ANY(col)而不是MIN(col)

Sql 从组中获取ANY(col)而不是MIN(col),sql,postgresql,optimization,psql,Sql,Postgresql,Optimization,Psql,我有一个SQL查询(从实际使用中简化): 但实际上,我不需要最小值-任何可乐值都可以-它只用于显示组中的示例值 目前PG必须进行分组,然后按cola对每个组进行排序,以找到组中的最小值,但这很慢,因为每个组中都有很多记录 Postgres是否有某种类型的FIRST(cola)或ANY(cola),只返回它首先看到的任何cola(就像MySQL在不使用聚合函数时所做的那样),或者不需要对每一行的cola进行排序/读取?尝试在sql末尾使用fetch FIRST row: 尝试在sql结尾使用fe

我有一个SQL查询(从实际使用中简化):

但实际上,我不需要最小值-任何可乐值都可以-它只用于显示组中的示例值

目前PG必须进行分组,然后按cola对每个组进行排序,以找到组中的最小值,但这很慢,因为每个组中都有很多记录


Postgres是否有某种类型的FIRST(cola)或ANY(cola),只返回它首先看到的任何cola(就像MySQL在不使用聚合函数时所做的那样),或者不需要对每一行的cola进行排序/读取?

尝试在sql末尾使用fetch FIRST row:


尝试在sql结尾使用fetch第一行:


我认为使用
DISTINCT ON()
而不使用order by将实现您的目标:

SELECT DISTINCT ON (ColB) ColA, ColB
FROM tbl;

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


但是,由于没有可处理的示例数据,我无法实际比较这是否优于使用
MIN
或任何其他聚合函数。

我认为使用
DISTINCT on()
而不使用order by将实现您所追求的目标:

SELECT DISTINCT ON (ColB) ColA, ColB
FROM tbl;

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

但是,由于没有可处理的示例数据,我无法实际比较这是否优于使用
MIN
或任何其他聚合函数的性能。

此语句:

目前,PG必须进行分组,然后按可乐对每组进行排序 查找组中的最小值,但这很慢,因为 每组都有很多记录

可以逻辑地描述博士后的工作,但不能解释实际发生的事情

Postgres——就像我熟悉的任何数据库一样——将为最小值保留一个“寄存器”。当新数据进入时,它会将下一行中的值与最小值进行比较。如果新值较小,则将复制该值。顺便说一句,这就是为什么
min()
max()
avg()
,和
count()
都比
count(distinct)
快。对于后者,必须维护组内的值列表

distinct on
方法可能比
group by
更快。但是,原因并不是因为数据库引擎正在对给定的
colb
的所有值进行排序,以获得最小值。

此语句:

目前,PG必须进行分组,然后按可乐对每组进行排序 查找组中的最小值,但这很慢,因为 每组都有很多记录

可以逻辑地描述博士后的工作,但不能解释实际发生的事情

Postgres——就像我熟悉的任何数据库一样——将为最小值保留一个“寄存器”。当新数据进入时,它会将下一行中的值与最小值进行比较。如果新值较小,则将复制该值。顺便说一句,这就是为什么
min()
max()
avg()
,和
count()
都比
count(distinct)
快。对于后者,必须维护组内的值列表


distinct on
方法可能比
group by
更快。然而,原因并不是因为数据库引擎正在对给定的
colb
的所有值进行排序,以获得最小值。

受Gareth上述答案的启发:


不确定它的性能是否比MIN()更好\更差。

受Gareth上述答案的启发:


不确定它的性能是否比MIN()更好\更差。

没错。我没有想到这一点,当没有GROUPBY子句时,这种情况肯定会发生。但是,colb是否为每一组保存了一份登记簿?例如,它是否为colb的每一个可能的值保存了一个MIN(cola)的寄存器?我想是的。这是我开始使用关系数据库时的老技术。哦,我不想承认多少年前了,没错。我没有想到这一点,当没有GROUPBY子句时,这种情况肯定会发生。但是,colb是否为每一组保存了一份登记簿?例如,它是否为colb的每一个可能的值保存了一个MIN(cola)的寄存器?我想是的。这是我开始使用关系数据库时的老技术。哦,我不想承认多少年前。
SELECT DISTINCT ON (ColB) ColA, ColB
FROM tbl;
; WITH C as (SELECT *, ROW_NUMBER() OVER (PARTITION BY ColB) as rn FROM tbl)
SELECT *
FROM c
WHERE rn = 1