'USv3s_tggf19'
我正在PostgreSQL 服务器中提取此查询 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'
我将不胜感激任何指导。
工作 dbfiddleuk 示例
我简化了数据以帮助我理解一点;但这个 SQL 应该很接近。
有关横向的更多信息
在横向设计模式之前,人们会使用子查询、行号和协调来做到这一点。
在使用 row_number 之前,我们将使用内联视图来获取每个 goal_id 的最大/最小日期,然后将其连接回 mods 的基本集以获取所有列。
只是各个时代的设计模式有所不同。
侧面基本上说:
-- 对于 user_Steps 中的每一行,获取该目标的相关 mods(相关性),其具有创建日期之后最早的修改日期(再次相关性)。
为了将来的参考,您可以使用 dbfiddle.uk 来模拟示例或使用 https://ozh.github.io/ascii-tables/来模拟文本表。
给我们:(我使用 ascii 表(上面的 github.io 链接)通过复制和粘贴来自 dbfiddle.uk 的结果来生成)
这假设 goal_ID 和日期比较是 user_steps 和 mods 之间所需的唯一关系,并且您只需要创建日期之后的最新 mod 记录。但如果您想要该日期之后的第一个,您可以将限制更改为 2 或将顺序更改为升序。
试试看; 如果不起作用,请让我们知道哪些地方不起作用/未达到预期。如果您不明白某事,请提出问题;我很乐意解释!