Postgre SQL:表之间的条件联接并仅保留最近的日期

问题描述 投票:0回答:1

我正在 PostgreSQL

'USv3s_tggf19'
服务器中提取此查询 os 用户
database

select us.id as user_step_id, us.goal_id, us.user_id, us.created_datetime
, m.mod_code, m.modified_datetime
from database.user_steps us
left join database.mods m on
us.goal_id = m.goal_id 
where us.user_id like 'USv3s_tggf19'

这是我的桌子:

output

如您所见,因为在database.mods表中存在与同一事物的不同修改相关的重复记录,所以我最终在输出中出现重复记录,这是预期的。

现在,我的目的是将

m.modified_date
中最接近的记录留在
us.created_datetime
中。我的最终结果应该是这样的:

desired_output

我一直在尝试在其他响应中查找不同的内容,这个查询是看起来最接近的一个,但它不会从

mods
表中返回任何信息。

select us.id as user_step_id, us.goal_id, us.user_id, us.created_datetime
, m.mod_code, m.modified_datetime
from database.user_steps us
left join database.mods m on
us.goal_id = m.goal_id 
and us.created_datetime = (select max(m.modified_datetime) from database.mods m  where m.modified_datetime < us.created_datetime)
where us.user_id like 'USv3s_tggf19'

如果有任何指导,我将不胜感激。

postgresql join
1个回答
0
投票

演示 dbfiddleuk 示例

我简化了数据以帮助我理解一点;但这个 SQL 应该很接近。

SELECT us.id as user_step_id, us.goal_id, us.user_id, us.created_datetime
, m.mod_code, m.modified_datetime
FROM user_steps us
LEFT join LATERAL (SELECT mod_Code, goal_ID, modified_datetime 
                   FROM mods a 
                   WHERE a.modified_DateTime < us.created_datetime
                     and us.goal_id = a.goal_id 
                   Order by a.modified_DateTime desc
                   LIMIT 1) m
  on true 
WHERE us.user_id = 'A'

为了将来的参考,您可以使用 dbfiddle.uk 来模拟示例或使用 https://ozh.github.io/ascii-tables/ 来模拟文本表。

+--------------+---------+---------+------------------+----------+-------------------+
| user_step_id | goal_id | user_id | created_datetime | mod_code | modified_datetime |
+--------------+---------+---------+------------------+----------+-------------------+
| A            | A.1     | A       | 2024-05-10       | B2       | 2023-09-08        |
| B            | B.1     | A       | 2024-04-26       | I10      | 2024-02-02        |
| C            | C.1     | A       | 2024-03-12       | B5       | 2023-09-08        |
| D            | D.1     | A       | 2024-03-01       | I10      | 2024-02-02        |
| E            | E.1     | A       | 2024-02-16       | I10      | 2024-02-02        |
+--------------+---------+---------+------------------+----------+-------------------+
© www.soinside.com 2019 - 2024. All rights reserved.