Postgres - 无需聚合即可分组?
Postgres - Group by without having to aggregate?
这很难解释,但是说我有这个疑问:
SELECT *
FROM "late_fee_tiers"
它 return 是这样的:
我在代码中设置了验证以防止保存重复的 days
(注意有 2 行 days = 2
)。
我希望我的查询仔细检查 day
中只有唯一的行,如果有多个,select 第一个(所以它应该 return 3 行与 2,3,5).
我的第一个想法是使用 GROUP BY
天,而 select 使用 MIN("id")
。
问题是,我对 SQL 的理解还不够,因为它迫使我向每一列添加不同的聚合函数...但如果我不想这样做怎么办?根据我定义的单个聚合器函数,我希望该行为 "chosen",我不需要多个聚合器创建一些奇怪的混合行。我只希望 MIN() 函数选择那 1 行并填写该行的所有其余值。
我用什么函数来做这个,或者我会怎么做?
谢谢
您想使用 DISTINCT ON
:
select distinct on (day) *
from "late_fee_tiers"
order by day, id;
Why day
is also required in the order by
:
来自官方文档:
The DISTINCT ON expression(s) must match the leftmost ORDER BY
expression(s). The ORDER BY clause will normally contain additional
expression(s) that determine the desired precedence of rows within
each DISTINCT ON group.
这很难解释,但是说我有这个疑问:
SELECT *
FROM "late_fee_tiers"
它 return 是这样的:
我在代码中设置了验证以防止保存重复的 days
(注意有 2 行 days = 2
)。
我希望我的查询仔细检查 day
中只有唯一的行,如果有多个,select 第一个(所以它应该 return 3 行与 2,3,5).
我的第一个想法是使用 GROUP BY
天,而 select 使用 MIN("id")
。
问题是,我对 SQL 的理解还不够,因为它迫使我向每一列添加不同的聚合函数...但如果我不想这样做怎么办?根据我定义的单个聚合器函数,我希望该行为 "chosen",我不需要多个聚合器创建一些奇怪的混合行。我只希望 MIN() 函数选择那 1 行并填写该行的所有其余值。
我用什么函数来做这个,或者我会怎么做?
谢谢
您想使用 DISTINCT ON
:
select distinct on (day) *
from "late_fee_tiers"
order by day, id;
Why
day
is also required in theorder by
:
来自官方文档:
The DISTINCT ON expression(s) must match the leftmost ORDER BY expression(s). The ORDER BY clause will normally contain additional expression(s) that determine the desired precedence of rows within each DISTINCT ON group.