【问题标题】:SQL joined by last dateSQL 按最后日期加入
【发布时间】:2013-06-24 14:31:21
【问题描述】:

这是一个不止一次在这里问过的问题,但是我找不到我要找的东西。我正在寻找连接两个表,其中连接的表由按日期时间排序的最后一个寄存器设置,直到这里一切正常。

我的问题是连接表上有两条以上的记录,让我给你看一个示例

table_a
-------
id
name
description
created
updated

table_b
-------
id
table_a_id
name
description
created
updated

一开始我做的是:

SELECT a.id,  b.updated
FROM table_a AS a 
LEFT JOIN (SELECT table_a_id, max (updated) as updated 
           FROM table_b GROUP BY table_a_id ) AS b 
ON a.id = b.table_a_id

直到这里我得到了 cols,a.idb.updated。我需要完整的table_b cols,但是当我尝试向我的查询添加一个新的 col 时,Postgres 告诉我我需要将我的 col 添加到一个 GROUP BY 条件才能完成查询,结果不是我正在寻找。

我正在尝试找到获得此列表的方法。

【问题讨论】:

  • 您不应接受语法错误的答案。这是在愚弄其他寻求帮助的人。
  • 老实说,这两个问题都对我有用,因为我对这个问题没有足够的知识,我不知道其中一个是正确的还是语法上的,我只是接受第一个,阅读后,我正在考虑使用您的解决方案并了解更多信息,但一定不能正确选择答案。
  • “两者”?一共有三个答案,你接受了一个不起作用的答案。
  • @Erwin,你的回答和我接受的另一个为我工作,另一个与我选择的相似
  • select distinct on(table_a_id) as table_a_id 无法工作。这是无效的。如果你想接受这个答案,那取决于你。但是请注意,然后您将其修复。如果您无法自行编辑(您可能还没有权限),请留言让 Gordon 修复它。无论如何,我会自己做,只是想传达信息。

标签: sql postgresql greatest-n-per-group


【解决方案1】:

DISTINCT ON 或者是你的朋友。这是一个正确语法的解决方案:

SELECT a.id, b.updated, b.col1, b.col2
FROM   table_a as a
LEFT   JOIN (
   SELECT DISTINCT ON (table_a_id)
          table_a_id, updated, col1, col2
   FROM   table_b
   ORDER  BY table_a_id, updated DESC
   ) b ON a.id = b.table_a_id;

或者,从table_b获取整行

SELECT a.id, b.*
FROM   table_a as a
LEFT   JOIN (
   SELECT DISTINCT ON (table_a_id)
          *
   FROM   table_b
   ORDER  BY table_a_id, updated DESC
   ) b ON a.id = b.table_a_id;

在这个密切相关的问题下对该技术以及替代解决方案的详细说明:
Select first row in each GROUP BY group?

【讨论】:

【解决方案2】:

试试:

SELECT a.id,  b.*
FROM table_a AS a 
LEFT JOIN (SELECT t.*, 
                  row_number() over (partition by table_a_id 
                                     order by updated desc) rn
           FROM table_b t) AS b 
ON a.id = b.table_a_id and b.rn=1

【讨论】:

  • 我已经尝试过这个答案,但是告诉我 t.* 必须包含在 GROUP BY 中
  • @Carlos:抱歉,查询中应该包含 GROUP BY - 我现在已经更正了。
  • 非常感谢您抽出宝贵时间,我选择了 Erwin 答案,因为它有更多解释,但它与您的答案相似。非常感谢
【解决方案3】:

你可以使用 Postgres 的 distinct on 语法:

select a.id, b.*
from table_a as a left join
     (select distinct on (table_a_id) table_a_id, . . . 
      from table_b
      order by table_a_id, updated desc
     ) b
     on a.id = b.table_a_id

. . . 所在的位置,您应该放入所需的列。

【讨论】:

  • 我已经改变了我对答案的选择,因为我正在阅读更多关于它的内容,而欧文问题是正确的问题。希望不要对我的选择让你失望,也mark,但是Erwin给了我更多的选择和解释。非常感谢您的宝贵时间
猜你喜欢
  • 1970-01-01
  • 2012-03-01
  • 2019-08-16
  • 1970-01-01
  • 2018-04-16
  • 2020-06-12
  • 2017-04-13
  • 1970-01-01
  • 2015-07-24
相关资源
最近更新 更多