两列中的Postgres不同查询
Posted
技术标签:
【中文标题】两列中的Postgres不同查询【英文标题】:Postgres distinct query in two columns 【发布时间】:2021-09-02 00:20:35 【问题描述】:我想写一个 postgres 查询。对于 (career-id 和 uid) 的每个不同组合,我应该返回具有最大时间的整行。 这是样本数据
id time career_id uid content
1 100 10000 5 Abc
2 300 6 7 xyz
3 200 10000 5 wxv
4 150 6 7 hgr
回答:
id time career_id uid content
2 300 6 7 xyz
3 200 10000 5 wxv
【问题讨论】:
【参考方案1】:这可以在 Postgres 中使用 distinct on ()
来完成
select distinct on (career_id, uid) *
from the_table
order by career_id, uid, "time" desc;
【讨论】:
【参考方案2】:您可以为此使用 CTE。这样的事情应该可以工作:
WITH cte_max_value AS (
SELECT
career_id,
uid,
max("time") as max_time
FROM mytable
GROUP BY career_id, uid
)
SELECT DISTINCT t.*
FROM mytable AS t
INNER JOIN cte_max_value AS cmv
ON t.uid = cmv.uid AND t.career_id = cmv.career_id AND t.time = cmv.max_time
CTE 为您提供 career_id
和 uid
的所有唯一组合以及相关的最大时间,然后内部连接将整个行连接到其中。我正在使用,如果你得到两行具有相同最大时间的career_id
和uid
的相同组合,你将得到两行返回。
如果您不希望这样,则需要找到解决此问题的策略。
编辑:a_hrose_with_name 的解决方案提出的解决方案也更好,除非您需要与其他服务器具有某种程度的兼容性(遗憾的是语法不同),否则您应该改用它。
【讨论】:
那些可怕的反引号在标准 SQL 和 Postgres 中是无效的。 感谢您指出这一点。另外,我绝对更喜欢你的解决方案,它更优雅。以上是关于两列中的Postgres不同查询的主要内容,如果未能解决你的问题,请参考以下文章