【问题标题】:Postgres distinct query in two columns两列中的Postgres不同查询
【发布时间】: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

【问题讨论】:

    标签: postgresql greatest-n-per-group


    【解决方案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 中是无效的。
      • 感谢您指出这一点。另外,我绝对更喜欢你的解决方案,它更优雅。
      猜你喜欢
      • 1970-01-01
      • 2018-03-06
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2021-11-10
      • 2019-02-21
      • 1970-01-01
      相关资源
      最近更新 更多