两列中的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_iduid 的所有唯一组合以及相关的最大时间,然后内部连接将整个行连接到其中。我正在使用,如果你得到两行具有相同最大时间的career_iduid 的相同组合,你将得到两行返回。 如果您不希望这样,则需要找到解决此问题的策略。

编辑:a_hrose_with_name 的解决方案提出的解决方案也更好,除非您需要与其他服务器具有某种程度的兼容性(遗憾的是语法不同),否则您应该改用它。

【讨论】:

那些可怕的反引号在标准 SQL 和 Postgres 中是无效的。 感谢您指出这一点。另外,我绝对更喜欢你的解决方案,它更优雅。

以上是关于两列中的Postgres不同查询的主要内容,如果未能解决你的问题,请参考以下文章

如何拆分列包括键和值到postgres中的单独列中

在 Postgres JSON 数组中查询

在 Postgres 的单个索引中包含多个列

在 Postgres 中的现有列中添加“串行”

postgres jsonb列中的模糊字符串匹配

Postgres - 将列中的各种名称替换为相应的唯一标识符