我正在 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'
这是我的桌子:
如您所见,因为在database.mods表中存在与同一事物的不同修改相关的重复记录,所以我最终在输出中出现重复记录,这是预期的。
现在,我的目的是将
m.modified_date
中最接近的记录留在 us.created_datetime
中。我的最终结果应该是这样的:
我一直在尝试在其他响应中查找不同的内容,这个查询是看起来最接近的一个,但它不会从
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'
如果有任何指导,我将不胜感激。
我简化了数据以帮助我理解一点;但这个 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 |
+--------------+---------+---------+------------------+----------+-------------------+